目前分類:軟體與通訊工程專欄 (79)

瀏覽方式: 標題列表 簡短摘要
ez100PU讀卡機 設定方式

http://www.bot.com.tw/BOTATM/setup.htm

prague12 發表在 痞客邦 留言(0) 人氣()

圖文介紹版
http://www.dotblogs.com.tw/larrynung/archive/2009/03/01/7325.aspx
引自 :http://blog.udn.com/jstw/3636717



加入連續 媒體至PLAYLIST中

AxWindowsMediaPlayer1.currentPlaylist.appendItem(AxWindowsMediaPlayer1.newMedia("D:\1.WMV"))
AxWindowsMediaPlayer1.currentPlaylist.appendItem(AxWindowsMediaPlayer1.newMedia("D:\2.AVI"))

之後使用AxWindowsMediaPlayer1.Ctlcontrols.play() 來播放

'禁止使用右鍵(功能鍵)
axWindowsMediaPlayer1.enableContextMenu = false

'設置播放圖像大小
axWindowsMediaPlayer1.DisplaySize

    1-MpDefaultSize         原始大小
    2-MpHalfSize           原始大小的一半
    3-MpDoubleSize          原始大小的兩倍
    4-MpFullScreen          全屏
    5-MpOneSixteenthScreen      屏幕大小的1/16
    6-MpOneFourthScreen       屏幕大小的1/4
    7-MpOneHalfScreen        屏幕大小的1/2

AxWindowsMediaPlayer媒體文件主要方法屬性

屬性/方法名: 說明:
[基本屬性]  
URL:String; 指定媒體位置,本機或網絡地址
uiMode:String; 播放器界面模式,可為Full, Mini, None, Invisible
playState:integer; 播放狀態,1=停止,2=暫停,3=播放,6=正在緩衝,9=正在連接,10=準備就緒
enableContextMenu:Boolean; 啟用/禁用右鍵菜單
fullScreen:boolean; 是否全屏顯示
//播放器基本控制
Ctlcontrols.play; 播放
Ctlcontrols.pause; 暫停
Ctlcontrols.stop; 停止
Ctlcontrols.currentPosition:double; 當前進度
Ctlcontrols.currentPositionString:string; 當前進度,字符串格式。如「00:23」
Ctlcontrols.fastForward; 快進
Ctlcontrols.fastReverse; 快退
Ctlcontrols.next; 下一曲
Ctlcontrols.previous; 上一曲
[settings] wmp.settings //播放器基本設置
settings.volume:integer; 音量,0-100
settings.autoStart:Boolean; 是否自動播放
settings.mute:Boolean; 是否靜音
settings.playCount:integer; 播放次數
[currentMedia] wmp.currentMedia //當前媒體屬性
currentMedia.duration:double; 媒體總長度
currentMedia.durationString:string; 媒體總長度,字符串格式。如「03:24」
currentMedia.getItemInfo(const string); 獲取當前媒體信息"Title"=媒體標題,"Author"=藝術家,"Copyright"=版權信息,"Description"=媒體內容描述, "Duration"=持續時間(秒),"FileSize"=文件大小,"FileType"=文件類型,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通過屬性名設置媒體信息
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //當前播放列表屬性
currentPlaylist.count:integer; 當前播放列表所包含媒體數
currentPlaylist.Item[integer]; 獲取或設置指定項目媒體信息,其子屬性同wmp.currentMedia
axWindowsMediaPlayer1.currentMedia.sourceURL; //獲取正在播放的媒體文件的路徑
axWindowsMediaPlayer1.currentMedia.name; //獲取正在播放的媒體文件的名稱
axWindowsMediaPlayer1.Ctlcontrols.Play          播放
axWindowsMediaPlayer1.Ctlcontrols.Stop          停止
axWindowsMediaPlayer1.Ctlcontrols.Pause          暫停
axWindowsMediaPlayer1.Ctlcontrols.PlayCount        文件播放次數
axWindowsMediaPlayer1.Ctlcontrols.AutoRewind       是否循環播放
axWindowsMediaPlayer1.Ctlcontrols.Balance         聲道
axWindowsMediaPlayer1.Ctlcontrols.Volume         音量
axWindowsMediaPlayer1.Ctlcontrols.Mute          靜音
axWindowsMediaPlayer1.Ctlcontrols.EnableContextMenu    是否允許在控件上點擊鼠標右鍵時彈出快捷菜單
axWindowsMediaPlayer1.Ctlcontrols.AnimationAtStart    是否在播放前先播放動畫
axWindowsMediaPlayer1.Ctlcontrols.ShowControls      是否顯示控件工具欄
axWindowsMediaPlayer1.Ctlcontrols.ShowAudioControls    是否顯示聲音控制按鈕
axWindowsMediaPlayer1.Ctlcontrols.ShowDisplay       是否顯示數據文件的相關信息
axWindowsMediaPlayer1.Ctlcontrols.ShowGotoBar       是否顯示Goto欄
axWindowsMediaPlayer1.Ctlcontrols.ShowPositionControls  是否顯示位置調節按鈕
axWindowsMediaPlayer1.Ctlcontrols.ShowStatusBar      是否顯示狀態欄
axWindowsMediaPlayer1.Ctlcontrols.ShowTracker       是否顯示進度條
axWindowsMediaPlayer1.Ctlcontrols.FastForward       快進
axWindowsMediaPlayer1.Ctlcontrols.FastReverse       快退
axWindowsMediaPlayer1.Ctlcontrols.Rate          快進/快退速率
axWindowsMediaPlayer1.AllowChangeDisplaySize 是否允許自由設置播放圖像大小

prague12 發表在 痞客邦 留言(0) 人氣()

多執行緒要傳給form的控制項的方法

'----------------------------
法1.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
End Sub





法2.

請參考(http://msdn2.microsoft.com/zh-tw/library/ms171728.aspx)
引自: http://www.wretch.cc/blog/wthomasu/2977217
小弟的解決方法如下:

' 建立一個Delegate事件來處理安全姓的非同步呼叫
Delegate Sub GetMsgCallback(ByVal msg As String)
' 以下這個方法就是您被呼叫的method
Public Sub GetMsg(ByVal msg As String)
' TextBox1就是您用來取得資料或指定資料的控制項
If Me.TextBox1.InvokeRequired Then
Dim d As New GetMsg(AddressOf GetMsgCallback)
Me.Invoke(d, New Object() {value})
Else
Me.TextBox1.Text= "應該就沒問題了"
End If
End Sub

prague12 發表在 痞客邦 留言(0) 人氣()

step0:讀取webcam列表
capGetDriverDescriptionA 只能不知道為啥讀到一個 參考其他如下文

放棄用capGetDriverDescriptionA了

參考某人:
改成用WM_CAP_DLG_VIDEOSOURCE
不過還是很想知道capGetDriverDescriptionA為什麼抓不到裝置= =



jk:雖然列表列不出來 不過還是可以透過使用"選擇來源"來選第二隻webcam
'step1:要先連接視訊驅動
'step2:觸發選擇目前視訊來源視窗





以下引自
http://www.blueshop.com.tw/board/show.asp?subcde=BRD2007072614550011F&fumcde=FUM20050124191756KKC
Public Class Form1
2
3 Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" _
4 (ByVal lpszWindowName As String, ByVal dwStyle As Integer, _
5 ByVal x As Integer, ByVal y As Integer, _
6 ByVal nWidth As Integer, ByVal nHeight As Integer, _
7 ByVal hwndParent As Integer, ByVal nID As Integer) As Integer
8
9 Private Declare Function capGetDriverDescription Lib "avicap32.dll" Alias "capGetDriverDescriptionA" _
10 (ByVal dwDriverIndex As Integer, ByVal lpszName As String, _
11 ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean
12
13 Private Declare Function SendMessageAsLong Lib "user32" Alias "SendMessageA" _
14 (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
15
16 Private hWnd As Integer = 0
17 Private WithEvents tmr As Timer
18

'step1:要先連接視訊驅動
19 Private Sub Form1_Load(ByVal s As Object, ByVal e As EventArgs) Handles MyBase.Load
20 hWnd = capCreateCaptureWindow("PH Capture", &H40000000 Or &H10000000, 0, 0, 320, 240, PictureBox1.Handle, 0)
21 SendMessageAsLong(hWnd, 1034, 0, 0)
22 SendMessageAsLong(hWnd, 1038, 44, 0)
23 SendMessageAsLong(hWnd, 1974, 1, 0)
24 SendMessageAsLong(hWnd, 1976, 66, 0)
25 Application.DoEvents()
26 tmr = New Timer
27 tmr.Interval = 100
28 tmr.Start()
29 End Sub
30
31 Private Sub tmr_Tick(ByVal s As Object, ByVal e As EventArgs) Handles tmr.Tick
32 SendMessageAsLong(hWnd, 1084, 0, 0)
33 SendMessageAsLong(hWnd, 1054, 0, 0)
34 End Sub
35

'step2:觸發選擇目前視訊來源視窗
36 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
37 SendMessageAsLong(hWnd, 1066, 0, 0) ' 視訊來源 找選擇哪隻webcam
38 End Sub
39
40 Private Sub Form1_FormClosed(ByVal s As Object, ByVal e As FormClosedEventArgs) Handles Me.FormClosed
41 tmr.Stop()
42 SendMessageAsLong(hWnd, 1035, 0, 0)
43 End Sub
44
45 End Class

prague12 發表在 痞客邦 留言(0) 人氣()

Windows XP 中 RASPPPoE 開機自動連線上網

引自:
http://chaomengyang.wordpress.com/2007/09/23/windows-xp-%E4%B8%AD-raspppoe-%E9%96%8B%E6%A9%9F%E8%87%AA%E5%8B%95%E9%80%A3%E7%B7%9A%E4%B8%8A%E7%B6%B2/



Windows XP 中 RASPPPoE 開機自動連線上網的教學
適用的作業系統:
Microsoft Windows XP Home Edition
Microsoft Windows XP Professional
Microsoft Windows 2000 Professional
Microsoft Windows 2000 Server
Microsoft Windows 2000 Advanced Server
Microsoft Windows 2000 Datacenter Server

PS: Windows XP 因本身系統支援 PPPoE (乙太網路上的點對點通訊協定),
故不需要安裝 RASPPPoE 也能使用本方法。

假設 Windows XP 系統是安裝在 C:\Windows 資料夾下
假設 原本的撥號連線名稱叫 "ADSL"

STEP 01. 首先需要確認系統上的 RASPPPoE 連線已經正確撥號連線過,
並且已選取 「儲存密碼」選項。

STEP 02. 於「網路上的芳鄰」上按滑鼠右鍵並點選「內容」選項
在出現的視窗中 RASPPPoE 連線 (如: 連線名稱為 "ADSL")
上按滑鼠右鍵點選「內容」選項 。

STEP 03. 確認已取消選取 選項 -> 撥號選項 中的「提示名稱、密碼、憑證等」及
「提示要求輸入電話號碼」兩項。

STEP 04. 確認已選取 選項 -> 重撥選項 中的 「斷線後重新撥號」的功能
按下方的「確定」鍵儲存設定。

STEP 05. 點選 「開始」功能表 -> 選擇「控制台」
在「控制台」內的「排定的工作」上點滑鼠兩下
點選「新增排定的工作」兩下啟動「排程工作精靈」
在「排程工作精靈」視窗中點選「下一步」-> 點選「瀏灠」
選擇 "C:\Windows\System32\RasPhone.exe" -> 點選「開啟」
(若看不到該檔案,請直接將RasPhone.exe輸入至開始欄裡)
輸入工作名稱: ADSL 自動連線
並選擇「在你登入時執行」-> 點選「下一步」
輸入系統管理員帳號 (如: Administrator 帳號) 或是具有系統管理員權限帳號
之登入帳號及登入密碼 -> 點選「下一步」-> 點選「完成」。

STEP 06. 在先前新增的工作圖示上按滑鼠右鍵 -> 點選「內容」
將執行的文字列中的 "C:\Windows\System32\RasPhone.exe" 改為:
C:\Windows\System32\RasPhone.exe -d "原本先現的視窗中 RASPPPoE 連線名稱"。
(如: C:\Windows\System32\RasPhone.exe -d "ADSL")

STEP 07. 確認選取「工作」下方兩個選項都打勾(登入時才執行)(啟用)

STEP 08. 確認取消選取 所有「設定」中的選項,按「確定」鍵套用新的設定。
PS: 系統會要求輸入用來登入的帳號及密碼以確認身份。

STEP 08. 點選「開始」功能表,選擇「執行」, 於「執行」視窗中 輸入「REGEDIT」
並按下「確定」鍵用以開啟「登錄編輯器」。
PS:有的系統是都已經有開好的.STEP 09. 在「登錄編輯器」視窗中切換到下列位址:
「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon」
在上面之位址的按滑鼠右鍵,選擇「新增」->「字串值」
將新字串的名稱「新數值 #1」修改成「KeepRasConnections」
在新增的字串上按滑鼠右鍵,選擇「修改」,
在「編輯字串」視窗中的數值資料文字列中輸入「1」
輸入後,按「確定」後離開,關閉登錄編輯器。
PS: 數值為「1」表示啟用這個功能,表示保持網路連線而不會因為使用者的登出而斷線。

STEP 10. 重新開機即可使設定生效,至此之後 Windows XP 不需登入系統即可自動撥號連上網路。

prague12 發表在 痞客邦 留言(0) 人氣()

以下是 參考c#範例 jkfixed 成vb.net 的 抓取ipcam 影像的範例
使用的是AXIS 牌子的 ipcam ,這牌子似乎是被認為best的ipcam之一
他的api確實清楚好用

參考
http://www.codeproject.com/KB/audio-video/cameraviewer.aspx
http://www.axis.com/techsup/cam_servers/dev/cam_http_api_2.php

'========================

Imports System.Web
Imports System.Net
Imports System.IO
Public Class Form1
Dim ii = 0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'// create HTTP request

Dim sourceURL = "http://141.117.159.36/axis-cgi/jpg/image.cgi?resolution=320x240&camera=1&compression=25&text=0&clock=0&date=0"
Dim req As HttpWebRequest = WebRequest.Create(sourceURL)
'// set login and password

req.Credentials = New NetworkCredential("root", "pass")

Dim resp As WebResponse = req.GetResponse()
'// get response stream

Dim stream As Stream = resp.GetResponseStream()
Dim read As Integer = 0
Dim buffer(400000) As Byte '400KB 暫存區
Dim total As Integer = 0


Do '回傳這次讀取了多少個 最多1000 個byte
read = stream.Read(buffer, total, 1000)
If (read <> 0) Then
total += read '累計總量
End If

Loop While (read <> 0)

'// get bitmap
Dim bmp As Bitmap = Bitmap.FromStream(New MemoryStream(buffer, 0, total))

PictureBox1.Image = bmp


ii = ii + 1
bmp.Save("Pic/IPcam_" + ii.ToString + ".bmp", Imaging.ImageFormat.Bmp) '轉存jpeg格式


End Sub

prague12 發表在 痞客邦 留言(3) 人氣()

在多個字串之間插入分隔符號 合併成一個字串

-----------------
引自
http://www.dotblogs.com.tw/ajun/archive/2009/03/08/7408.aspx

後來才發現有個更好用的東西.
就是string.Join,用法如下:

string[] arr = new string[5];
arr[0] = "abc";
arr[1] = "def";
arr[2] = "ghi";
arr[3] = "jkl";
arr[4] = "mno";
string tmpStr = string.Join(",", arr);
Console.WriteLine(tmpStr);

這樣是不是簡潔多了呢!!

prague12 發表在 痞客邦 留言(0) 人氣()

參考:
http://blog.wahahajk.com/2008/06/c.html
http://www.dotblogs.com.tw/yc421206/archive/2008/11/30/6132.aspx?fid=7377

細節參數
http://msdn.microsoft.com/zh-tw/library/system.diagnostics.stopwatch.aspx




ex:
在寫程式的時候我們常常需要測量程式執行時間 .NET本身有提供所謂的效能計數器 精度非常高 但是使用上比較繁瑣 如果我們需要簡單的測量時間就好 對幾一千分之一秒的時間誤差沒有很刻求 那以下有兩種常用的方法可以簡單的計算目標程式所花費的執行時間

範例:
//方法一
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();//引用stopwatch物件
sw.Reset();//碼表歸零
sw.Start();//碼表開始計時
/**************/
/**************/
/***目標程式***/
/**************/
/**************/
sw.Stop();//碼錶停止
//印出所花費的總豪秒數
string result1 = sw.Elapsed.TotalMilliseconds.ToString();

prague12 發表在 痞客邦 留言(1) 人氣()

網路頻寬速度單位詳解


許多人對 Kbps、KB、Mbps 等速度單位有所誤解,以下簡單解釋一下所謂的1.5M、3M、6M 如何計算。所謂 1.5M 寬頻,其實是指 1.5Mbps (bits persecond),亦即 1.5 x 1024 / 8 = 192KB/sec,但這只是理論上的速度,實際上則要再扣約 12% 的 Ethernet Header, IP Header, TCP Header,ATM Header 等控制訊號,故其傳輸速度上限應為 169KB/sec 左右。
在傳輸單位的寫法上,B 和 b 分別代表 Bytes 和 bits,兩者的定義是不同的,千萬不要混淆。
1 Byte = 8 bits
1 Kb = 1024 bits
1 KB = 1024 bytes
1 Mb = 1024 Kb
1 MB = 1024 KB

寬頻最高下載理論值:
1.5 M = 169 KB/s
3 M = 338 KB/s
6 M = 676 KB/s
10 M = 1126 KB/s

另外外加,傳輸速率代號 :
T1 1.544Mbps
E1 2.048Mbps
T2 6.17Mbps
T3 45Mbps
OC1 51.84Mbps
OC3 155.5Mbps
OC12 622Mbps
ATM 155Mbps
STM1 155.5Mbps
STM4 622Mbps
T1,E1,T2,T3:都是專線的規格。
T1的專線的頻寬在北美區為1.544Mbps,表示每一秒鐘可以傳送1.5百萬位,歐洲則是2.048Mbps,台灣與北美均是1.544Mbps。
T2專線是6.1Mbps為T1的4倍。
T3專線是45Mbps,為T1的30倍。
OC-Level (OC1,OC3,OC12):利用光纖纜線作為傳輸媒介:
OC1的傳輸能力是51.84Mbps,
而OC3是155.5Mbps,為OC1的3倍,
OC12是622Mbps,為OC3的4倍。
ATM:是一種高速的資料傳輸技術。最快傳輸速度為155Mbps,傳輸能力比3條T3專線加起來還快。
STM1,STM4:以光纖纜線為傳輸媒體,STM1的速率是155.5Mbps,STM4是622Mbps
資料來源:台灣論壇 siwen

prague12 發表在 痞客邦 留言(1) 人氣()

‎//猜猜看 輸出數字是多少? (永遠的不等)

#include "stdafx.h"
#include "stdlib.h" // ex: atoi()

//---------------------------
int main(int argc, char* argv[])
{

float ss= atof("123.33");字串轉數字
char stt[10];
gcvt(ss,10,stt); //數字轉字串 字串長度=10
// gcvt(ss,10,stt);
printf("Hello World!\n");
printf(stt);

return 0;
}

prague12 發表在 痞客邦 留言(0) 人氣()

讀取SMS步驟大要
jk測試ok

(在這張測試SIM卡裡存有兩則訊息 一則英文 一則中文)
detail參考: PUTAL AT命令 AT指令集中文版
以下是實現反應
=======================


AT+CMGF=1 //要先調成text模式 則之後吃字串參數



AT+CMGL=?
------------------
+CMGL: ("REC UNREAD", "REC READ", "STO UNSENT", "STO SENT", "ALL") //有四種訊息模式

OK






AT+CMGL="REC READ" //讀取"已讀過的訊息"
-------------------------

+CMGL: 2,"REC READ","886912754176",,"2011/01/28 17:34:38+32"
book //英文字的編碼可以直接顯示

+CMGL: 3,"REC READ","886912754176",,"2011/01/28 17:35:47+32"
70BA6BBA //中文字的pdu編碼不能直接顯示 手機中會顯示中文字

OK





C.接收 刪除 檢查 訊息
=========================================
接收短消息
AT+CNMI=2,1,0,0,0
新消息(除 class0 类型外)以下列方式指示
+CMTI: ,
OK
+CMTI:” SM” ,3 新消息指示,表示有一条新消息存储在SIM第三条记录




删除短消息
AT+CMGD=1 删除SIM卡中的第index=1條訊息
OK



查看SIM卡使用保存情况
AT+CPMS?
+CPMS:” SM” ,11,25, ” SM” ,11,25, ” SM” ,11,25
SIM卡可保存25 条短消息,现有短消息11 条
OK

prague12 發表在 痞客邦 留言(0) 人氣()

AT^CIPSTART=TCP, 121.32.16.103,2020 ?接到服?器
AT^CIPSEND=hello,Putal ?送字符?据
AT^CIPCLOSE ???接
AT+CGATT= 0 ??移??景

以上為ptb200模組的tcp封包發送使用命令 詳見模組文件

----------------------------------------------------------------------------------------------------------------------
中華電信GPRS設定APN方法 2011.0201
JK測試發送封包成功 遠端socket接收成功
======
1.先設APN
AT^ACCSETTING=internet,CHT internet, , ,0

2.有了APN 以後再設
AT^TCPSETTING=10.1.1.1,8080,internet,1, , ,

3.跟遠端ip建立連線
AT^TCPSETTING=10.1.1.1,8080,internet,1, , , JK:硬體重啟需要重設TCP 不然連線會fail
AT^CIPSTART=TCP,122.122.147.158,9996

4.連線成功以後 再發送字串封包
AT^CIPSEND=hello,I am a package

5.關閉連線
AT^CIPCLOSE
======================

以上為主要步驟 中華3G/2G的合體sim卡可用
!!特別注意:中華的預付卡tcp功能會連不上遠端IP
可能是預付卡需要另外去辦理開通gprs

以下是本次實做的參考值僅供幫助理解
ps:
socket 的遠端IP port是任意選的所以有時候會有連不上的狀況 換一個能正常連接的port就好


實際反應值
AT^CIPCLOSE
CLOSE OK
AT^CIPSTART=TCP,122.122.147.158,9996
OK
STATE:-1
CONNECT FAIL

AT^CIPSTART=TCP,122.122.147.158,9994
OK
CONNECT OK
AT^CIPSEND=hello,I am a package2
SEND OK

===============================



封包發送測試成功後的查詢

AT^TCPSETTING=

APN:internet 'apn名稱要去官方查 中華電信似乎有兩組 這是其一 在此測試成功
GATEWAY:10.1.1.1 '官方給的ip ..以下設定值都是去查的
PORT:8080
USER NAME:
PASSWORD:
CONN TYPE:1 'JK:中華電信是採用WAP協定 所以要選1 , 如果是tcp協定要選0



AT^ACCSETTING=internet

ACCOUNT NAME:CHT internet
APN:internet
USER NAME:
PASSWORD:
AUTH TYPE:NORMAL

==========================

prague12 發表在 痞客邦 留言(0) 人氣()

參考: 程式揭秘:從C/C++程式碼探索電腦系統的運作原理
博碩出版
作者:左飛
http://books.yam.com/book/book_page.asp?LID=se008&kmcode=2013120118980&Actid=wise&partner=yam

'------------------------------------------
平常就可以注意的
高效技巧

1.
*(a+i) 等價 a[i]
指標記憶體存取 速度更快

2.
迴圈展開
內部式增加 減少迴圈判斷次數 效能提升

3.
查表置換
減少迴圈內部的重複運算

4.
提出變數
迴圈內部的複雜變數越少越好 減低熱點

prague12 發表在 痞客邦 留言(0) 人氣()

用winform 連結accsee資料庫


1.連線字串要注意 精靈產生的還是會錯
2.dataset 要指定給gridview的時候必須指定到 dataset.表

'------------------------------------
Imports System.Data.OleDb 'access 的adapter 命名空間

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'要注意 access精靈生出來的連線字串也會有錯 改正後如下
Dim conn_str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db1.mdb" '要修正成這樣
Dim Conn As New OleDb.OleDbConnection(conn_str)

Conn.Open()
' MsgBox(Conn.State)
Dim cmd_str_select = " SELECT 名字, 暱稱, 郵寄清單ID FROM 郵寄清單"
'--------------------------------------------------
Dim ds As New DataSet
Dim myAdapter As OleDbDataAdapter = New OleDbDataAdapter(cmd_str_select, Conn) 'OleDataAdapter(SQL命令,連線)
myAdapter.Fill(ds, "MaAccount") '在這裡必須要明確指出表名
Conn.Close()


If ds.Tables.Count > 0 Then '可以測試insert 的確沒有回傳資料給 ds

DataGridView1.DataSource = ds.Tables(0) '寫法1 在這裡必須要明確指出來源要是 >> 表
' DataGridView1.DataSource = ds.Tables("MaAccount") '寫法2

End If

End Sub
End Class

prague12 發表在 痞客邦 留言(0) 人氣()

參考:
http://www.delightpress.com.tw/article_c.aspx?article_id=36
http://msdn.microsoft.com/zh-cn/library/bb690938(v=VS.90).aspx


PrintForm類別的常用成員如下:
■ Form屬性,要被列印的表單物件。
■ PrintAction屬性,要被列印的表單物件。
■ PrintFileName屬性,列印輸出的檔案名稱。當輸出導向「檔案」時,必須指定此屬性。
■ Print方法,執行列印功能,會將表單上任何可見的物件都輸出,包含使用Graphic方法所繪製的圖案。
Print方法有兩個多載:
■ Print(),會輸出表單目前可見的工作區。也就是不包含標題列、捲軸與框線。
■ Print(Form,PrintForm.PrintOption),第二個參數可以指定輸出的影像是否是表單的全部、工作區以及超出表單範圍的捲軸區塊。
PrintForm.PrintOption的列舉成員如下:
■ CompatibleModeClientAreaOnly,列印表單的工作區,使用相容模式。
■ CompatibleModeFullWindow,列印表單的完整區域,使用相容模式。
■ ClientAreaOnly,列印表單的工作區。
■ FullWindow,列印表單的完整區域,包含標題列、捲軸與框線。
■ Scrollable,列印完整工作區,包含超出表單範圍的捲軸區域


======================
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_print.Click
PrintForm1.DocumentName = TextBox_enumber.Text
PrintForm1.PrintAction = Printing.PrintAction.PrintToPreview
PrintForm1.PrintFileName = "./" + TextBox_enumber.Text + ".xps"

PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)
End Sub

prague12 發表在 痞客邦 留言(0) 人氣()

參考 http://blog.miniasp.com/post/2007/12/04/I-Found-two-very-useful-Calendar-for-Taiwan.aspx


System.Globalization 這個命名空間很有趣,竟然有 TaiwanCalendar 與 TaiwanLunisolarCalendar 類別!
可以由西元年 >> 找到 台灣民國曆 農民曆

===================================================
//TaiwanCalendar 是指台灣使用的曆法,也就是「民國年」的計算法。
DateTime now = new DateTime(2007, 12, 4);
TaiwanCalendar tc = new TaiwanCalendar();

int year = tc.GetYear(now);
Console.WriteLine(year.ToString());
// Output : 96

int month = tc.GetMonth(now);
Console.WriteLine(month.ToString());
// Output : 12

int dayOfMonth = tc.GetDayOfMonth(now);
Console.WriteLine(dayOfMonth.ToString());
// Output : 4

int daysInMonth = tc.GetDaysInMonth(year, month);
Console.WriteLine(daysInMonth.ToString());
// Output: 30
TaiwanLunisolarCalendar 是指台灣使用的陰陽曆(農曆)。和 TaiwanCalendar 相同,但可以使用西元年份計算,而日期和月份則使用陰陽曆計算,真的很省事!


TaiwanLunisolarCalendar tlc = new TaiwanLunisolarCalendar();
// 取得目前支援的農曆日曆到幾年幾月幾日( 2051-02-10 )
tlc.MaxSupportedDateTime.ToShortDateString();

// 取得今天的農曆年月日
txtContent.Text =
tlc.GetYear(DateTime.Now).ToString() + "-" +
tlc.GetMonth(DateTime.Now).ToString() + "-" +
tlc.GetDayOfMonth(DateTime.Now).ToString();

prague12 發表在 痞客邦 留言(0) 人氣()

BackgroundWorker的使用方法:

jk: 這個物件可以在桌機環境上創造第二執行緒工作環境 也可對應給 進度bar
但是jk認為 這個基本上只適合用來處理介面執行緒間的雜務
真正要跑多執行緒程式 請參照關鍵字 THREAD , address of
但是多執行緒作偵錯上很麻煩....

參考自 :
http://www.dotblogs.com.tw/billchung/archive/2009/05/29/8592.aspx

'----------------------------------------------

Public Class Form1

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

'------檢查進度回報bar--------------------
Dim i As Integer
For i = 1 To 100
BackgroundWorker1.ReportProgress(i) ' <==呼叫ReportProgress方法以引發ProgressChanged事件,參數為百分比的分子部份。
System.Threading.Thread.Sleep(1000)
Next
'-------/檢查進度回報bar/---------------------


End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BackgroundWorker1.WorkerReportsProgress = True '讓progressBAR起作用

If BackgroundWorker1.IsBusy = True Then
MessageBox.Show("背景作業執行中,請稍候!")
Else
Label1.Text = "開始於:" & Now().ToString("HH:mm:ss.fffffff")
BackgroundWorker1.RunWorkerAsync()
Label2.Text = "Click事件結尾:" & Now().ToString("HH:mm:ss.fffffff")
End If
End Sub



Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage '<==依據ReportProgress方法的傳入參數改變Progressbar的Value
Label3.Text = "進度i=" & e.ProgressPercentage & "/ 時間:" & Now.ToString("HH:mm:ss.fffffff") '<==顯示每一次ProgressBar改變的時間
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Label4.Text = "結束於:" & Now().ToString("HH:mm:ss.fffffff")
End Sub
End Class

prague12 發表在 痞客邦 留言(0) 人氣()

使用google email的smtp轉信

參考自 :http://www.dotblogs.com.tw/yc421206/archive/2010/01/05/12803.aspx

jkFIXed: 改寫一下成函數 內文是字串 解讀時屬於html的解讀

測試成功可用於ASP網頁
//=====================
Imports System.Data
Imports System.Net

Public Function To_email_message(ByVal receiver_of_Email As String, ByVal contentBODY As String, ByVal time As String) As String
Try


Dim mailTo_address As String = TextBox_mail.Text
Dim mail As New Mail.MailMessage()
Dim pwd As String = "netxxxxxx"
Dim receiver_cred As New NetworkCredential("hcgprague@gmail.com", pwd)
' Dim receiverTest As String
'receiverTest = "hcgprague@hotmail.com," + "prague12.tw@yahoo.com.tw"
'收件者
mail.To.Add(receiver_of_Email)
'mail.Subject = "subject gmail_test "
mail.Subject = "有新訂購" + time

'寄件者
mail.From = New System.Net.Mail.MailAddress("fff@gmail.com")
mail.IsBodyHtml = True
mail.Body = "messageAAAA content 中文也要來一下 " + vbNewLine + contentBODY

'設定SMTP
Dim smtp As New Mail.SmtpClient("smtp.gmail.com")
smtp.UseDefaultCredentials = False
smtp.EnableSsl = True
smtp.Credentials = receiver_cred
smtp.Port = 587

'送出Mail
smtp.Send(mail)

Return ("send EMAIL OK")

Catch ex As Exception
Return ("send EMAIL FAIL")
End Try

End Function

prague12 發表在 痞客邦 留言(0) 人氣()

鍵盤,滑鼠 全域hook ,vb winAPI dll 引用法

參考自:
C#篇 >> http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3320.aspx
VB篇 >> http://www.inpowers.net/viewthread.php?tid=31514&extra=page%3D1
'//--------------------------------------------------------------------------
jk_fix心得:
vb的部分 會因為 Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0) 導致失敗

hKeyboardHook = SetWindowsHookExA(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0)), 0)

得要使用winAPI GetModuleHandle() 去換掉 Marshal .....(細部參考c#篇)

之後即可成功使用全域hook
//-----------------------------------------------------------------------
'以下是jk 整合vb篇和c#篇後的結果 ~~測試ok可用
'//================================================
Public Class hook

#Region "定義結構"
Private Structure MouseHookStruct
Dim PT As Point
Dim Hwnd As Integer
Dim WHitTestCode As Integer
Dim DwExtraInfo As Integer
End Structure
Private Structure MouseLLHookStruct
Dim PT As Point
Dim MouseData As Integer
Dim Flags As Integer
Dim Time As Integer
Dim DwExtraInfo As Integer
End Structure
Private Structure KeyboardHookStruct
Dim vkCode As Integer
Dim ScanCode As Integer
Dim Flags As Integer
Dim Time As Integer
Dim DwExtraInfo As Integer
End Structure
#End Region


#Region "API聲明導入"
'//-------------------------寫法1---類同c#宣告---------------------------------------
_
Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
End Function
'--------------------寫法2-- 新名--------------------Alias 原名---------------------------
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Integer, _
ByVal lpfn As HookProc, _
ByVal hmod As Integer, _
ByVal dwThreadId As Integer) As Integer
'-----------------------------寫法3-----------新名=原名---省略宣告法----------------------------------------------
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal idHook As Integer) As Integer
'------------------------------------------------------------------------------------
Public Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal idHook As Integer, ByVal ncode As Integer, ByVal wParam As Int32, ByVal lParam As IntPtr) As Integer
'--------------------------------------------------------------------------------------

Public Declare Function ToAscii Lib "user32" (ByVal uVirtKey As Integer, ByVal uScancode As Integer, ByVal lpdKeyState As Byte(), ByVal lpwTransKey As Byte(), ByVal fuState As Integer) As Integer
Public Declare Function GetKeyboardState Lib "user32" (ByVal pbKeyState As Byte()) As Integer
Public Declare Function GetKeyState Lib "user32" (ByVal vKey As Integer) As Short
Public Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
#End Region

#Region "常量聲明"

Private Const WH_MOUSE_LL = 14
Private Const WH_KEYBOARD_LL = 13
Private Const WH_MOUSE = 7
Private Const WH_KEYBOARD = 2
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_LBUTTONUP = &H202
Private Const WM_RBUTTONUP = &H205
Private Const WM_MBUTTONUP = &H208
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MOUSEWHEEL = &H20A
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105
Private Const VK_SHIFT As Byte = &H10
Private Const VK_CAPITAL As Byte = &H14
Private Const VK_NUMLOCK As Byte = &H90
#End Region
''' 滑鼠啟動事件
Public Event MouseActivity As MouseEventHandler
''' 鍵盤按下事件
Public Event KeyDown As KeyEventHandler
''' 鍵盤輸入事件
Public Event KeyPress As KeyPressEventHandler
''' 鍵盤鬆開事件
Public Event KeyUp As KeyEventHandler
Private hMouseHook As Integer
Private hKeyboardHook As Integer
Private Shared MouseHookProcedure As HookProc
Private Shared KeyboardHookProcedure As HookProc
''' 創建一個全域滑鼠鍵盤鉤子 (請使用Start方法開始監視)
Sub New()
'留空即可
End Sub
''' 創建一個全域滑鼠鍵盤鉤子,決定是否安裝鉤子
''' 是否立刻掛鉤系統消息
Sub New(ByVal InstallAll As Boolean)
If InstallAll Then StartHook(True, True)
End Sub
''' 創建一個全域滑鼠鍵盤鉤子,並決定安裝鉤子的類型
''' 掛鉤鍵盤消息
''' 掛鉤滑鼠消息
Sub New(ByVal InstallKeyboard As Boolean, ByVal InstallMouse As Boolean)
StartHook(InstallKeyboard, InstallMouse)
End Sub
''' 析構函數
Protected Overrides Sub Finalize()
UnHook() '卸載物件時反註冊系統鉤子
MyBase.Finalize()
End Sub


'鍵盤消息的委託處理代碼
Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
Dim handled As Boolean = False
If nCode >= 0 Then
Dim MyKeyboardHookStruct As KeyboardHookStruct = DirectCast(Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct)), KeyboardHookStruct)
'啟動KeyDown
If wParam = WM_KEYDOWN OrElse wParam = WM_SYSKEYDOWN Then '如果消息為按下普通鍵或系統鍵
Dim e As New KeyEventArgs(MyKeyboardHookStruct.vkCode)
RaiseEvent KeyDown(Me, e) '啟動事件
handled = handled Or e.Handled '是否取消下一個鉤子
End If
'啟動KeyUp
If wParam = WM_KEYUP OrElse wParam = WM_SYSKEYUP Then
Dim e As New KeyEventArgs(MyKeyboardHookStruct.vkCode)
RaiseEvent KeyUp(Me, e)
handled = handled Or e.Handled
End If
'啟動KeyPress
If wParam = WM_KEYDOWN Then
Dim isDownShift As Boolean = (GetKeyState(VK_SHIFT) & &H80 = &H80)
Dim isDownCapslock As Boolean = (GetKeyState(VK_CAPITAL) <> 0)
Dim keyState(256) As Byte
GetKeyboardState(keyState)
Dim inBuffer(2) As Byte
If ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.ScanCode, keyState, inBuffer, MyKeyboardHookStruct.Flags) = 1 Then
Dim key As Char = Chr(inBuffer(0))
If isDownCapslock Xor isDownShift And Char.IsLetter(key) Then
key = Char.ToUpper(key)
End If
Dim e As New KeyPressEventArgs(key)
RaiseEvent KeyPress(Me, e)
handled = handled Or e.Handled
End If
End If
'取消或者啟動下一個鉤子
If handled Then Return 1 Else Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
End If
End Function
'滑鼠消息的委託處理代碼
Private Function MouseHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
If nCode >= 0 Then
Dim mouseHookStruct As MouseLLHookStruct = DirectCast(Marshal.PtrToStructure(lParam, GetType(MouseLLHookStruct)), MouseLLHookStruct)
Dim moubut As MouseButtons = MouseButtons.None '滑鼠按鍵
Dim mouseDelta As Integer = 0 '滾輪值
Select Case wParam
Case WM_LBUTTONDOWN
moubut = MouseButtons.Left
Form1.ComboBox1.SelectedText = "L"
'MsgBox("LB")
Case WM_RBUTTONDOWN
moubut = MouseButtons.Right
Form1.ComboBox1.SelectedText = "R"
'MsgBox("RB")

Case WM_MBUTTONDOWN
moubut = MouseButtons.Middle
' MsgBox("MidB")
Case WM_MOUSEWHEEL
MsgBox("ROLL ~over")
Application.Exit()


Dim int As Integer = (mouseHookStruct.MouseData >> 16) And &HFFFF
'本段代碼CLE添加,模仿C#的Short從Int棄位轉換
If int > Short.MaxValue Then mouseDelta = int - 65536 Else mouseDelta = int
End Select
Dim clickCount As Integer = 0 '按一下次數
If moubut <> MouseButtons.None Then
If wParam = WM_LBUTTONDBLCLK OrElse wParam = WM_RBUTTONDBLCLK OrElse wParam = WM_MBUTTONDBLCLK Then
clickCount = 2
Else
clickCount = 1
End If
End If
Dim e As New MouseEventArgs(moubut, clickCount, mouseHookStruct.PT.X, mouseHookStruct.PT.Y, mouseDelta)
RaiseEvent MouseActivity(Me, e)
End If
Return CallNextHookEx(hMouseHook, nCode, wParam, lParam) '啟動下一個鉤子
End Function


''' 開始安裝系統鉤子
''' 掛鉤鍵盤消息
''' 掛鉤滑鼠消息
Public Sub StartHook(Optional ByVal InstallKeyboardHook As Boolean = True, Optional ByVal InstallMouseHook As Boolean = False)



'註冊鍵盤鉤子
If InstallKeyboardHook AndAlso hKeyboardHook = 0 Then

Dim curProcess = Process.GetCurrentProcess
Dim curModule = curProcess.MainModule
'---------------------------------------------
KeyboardHookProcedure = New HookProc(AddressOf KeyboardHookProc)

Dim hook_intptr = GetModuleHandle(curModule.ModuleName)
' Dim hook_int = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly.GetModules()(0))

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, hook_intptr, 0)

If hKeyboardHook = 0 Then '檢測是否註冊完成
UnHook(True, False) '在這裡反註冊

MsgBox("error")
'Throw New Win32Exception(Marshal.GetLastWin32Error) '報告錯誤
End If
End If
'註冊滑鼠鉤子
If InstallMouseHook AndAlso hMouseHook = 0 Then

Dim curProcess = Process.GetCurrentProcess
Dim curModule = curProcess.MainModule
'---------------------------------------------
MouseHookProcedure = New HookProc(AddressOf MouseHookProc)
Dim hook_intptr = GetModuleHandle(curModule.ModuleName)
hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, hook_intptr, 0)
If hMouseHook = 0 Then
UnHook(False, True)
MsgBox("error")
' Throw New Win32Exception(Marshal.GetLastWin32Error)

End If
End If
End Sub
''' 立刻卸載系統鉤子
''' 卸載鍵盤鉤子
''' 卸載滑鼠鉤子
''' 是否報告錯誤
Public Sub UnHook(Optional ByVal UninstallKeyboardHook As Boolean = True, Optional ByVal UninstallMouseHook As Boolean = True, Optional ByVal ThrowExceptions As Boolean = False)
'卸載鍵盤鉤子
If hKeyboardHook <> 0 AndAlso UninstallKeyboardHook Then
Dim retKeyboard As Integer = UnhookWindowsHookEx(hKeyboardHook)
hKeyboardHook = 0
If ThrowExceptions AndAlso retKeyboard = 0 Then '如果出現錯誤,是否報告錯誤
Throw New Win32Exception(Marshal.GetLastWin32Error) '報告錯誤
End If
End If
'卸載滑鼠鉤子
If hMouseHook <> 0 AndAlso UninstallMouseHook Then
Dim retMouse As Integer = UnhookWindowsHookEx(hMouseHook)
hMouseHook = 0
If ThrowExceptions AndAlso retMouse = 0 Then
Throw New Win32Exception(Marshal.GetLastWin32Error)
End If
End If
End Sub

''' 鍵盤鉤子是否無效
Public Property KeyHookInvalid() As Boolean
Get
Return hKeyboardHook = 0
End Get
Set(ByVal value As Boolean)
If value Then UnHook(True, False) Else StartHook(True, False)
End Set
End Property
''' 滑鼠鉤子是否無效
Public Property MouseHookInvalid() As Boolean
Get
Return hMouseHook = 0
End Get
Set(ByVal value As Boolean)
If value Then UnHook(False, True) Else StartHook(False, True)
End Set
End Property
End Class

prague12 發表在 痞客邦 留言(0) 人氣()

// 範例解說: 這樣可以去搜索在路徑的資料夾內的檔案 逐一讀取

//-------------------------------------
public void Read_ALLfile()
{
while (true)
{
foreach (string sFile in Directory.GetFiles(@"c:\\eml"))
{// 這樣可以去搜索在路徑的資料夾內的檔案 逐一讀取
try
{

FileStream fs = File.Open(sFile, FileMode.Open, FileAccess.ReadWrite);

// StreamReader sr = new StreamReader(fs); 測試用
// string all = sr.ReadToEnd();
// MessageBox.Show(all);

EMLReader reader = new EMLReader(fs);
fs.Close();

//=======QP解碼===================
string body_content = QPDecode(reader.Body);
//=======/QP解碼/===================

}


catch (System.IO.IOException err)
{
MessageBox .Show ("File " + sFile + " is currently in use.");
}
Thread.Sleep(10);

}

// break;

}
}

prague12 發表在 痞客邦 留言(2) 人氣()