VB API函數: keybd_event ←函數模擬鍵盤行動
API宣告:
keybd_event
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
範例:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Sub Timer1_Timer()
Call keybd_event(82, 0, 0, 0) '模擬按下"R"鍵
End Sub
SendMessage() 與 PostMessage()
兩者宣告幾乎一樣 差別在於:
SendMessage()
將message送出去之後便會停住 ,等待該message處理完之後,才會return。
PostMessage()
送出去之後馬上return,使用PostMessage()會有速度比較快的優點。
API宣告:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Declare Function PostMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
這個函數有四個參數,它們的含義如下:
第一個參數hwnd是窗口句柄,是一個長整型數。Windows給每個控件一個編號,這個編號就稱為窗口句柄。有了這個句柄,我們就可以告訴Windows我們要控制哪個控件,所以這個句柄在API調用中至關重要。Visual Basic的大多數控件都包括hwnd屬性,如下拉框、TreeView等,窗體也有這個屬性。但也有一些控件沒有這個屬性,如標籤控件。沒有這個屬性就無法利用Windows API函數,但可以節省系統資源。
第二個參數是要傳遞的消息。API文檔中包括了所有消息的含義和用法,而每個消息所定義的常數在Win32api.txt中有可以找到。使用SendMessage傳遞消息,大多是為了完成以下幾個工作:
1、設置控件的一些選項,像我們要使用的CB_SETDROPPEDWIDTH的就屬於這種情況。儘管Visual Basic的每個控件都提供了許多屬性,但仍然有許多控件的選項沒有包括在其中。而這些選項中的大多數都可以利用SendMessage進行設置。
2、獲得控件的一些設置。同上一種情況相反,有時我們需要獲得控件的一些設置,這相當於讀取屬性。例如,如果想知道一個下拉框的下拉部分的寬度是多少,就可以向控件發送CB_GETDROPPEDWIDTH消息。對於這種情況,SendMessage函數的返回值就是結果。
3、執行一定的操作。例如,我們要在下拉框中尋找是否"ABC"這個字符串。當然,我們可以編寫一個循環,逐條比較看是否存在這樣的字符串。如果使用API,我們只需要向下拉框發送CB_FINDSTRING消息,這條消息就會自動進行查找工作並返回結果。
4、模擬用戶操作。我們有時希望模擬用戶的操作,比如關閉其他應用程序的窗口。其實只要我們能知道那個窗口的句柄,我們就可以發送WM_CLOSE消息給那個窗口,窗口接受到這條消息就會關閉,如同用戶關閉窗口一樣。
API消息的妙用很多,我們這裡只是介紹如何使用SendMessage來發送消息,更進一步的應用就留給讀者繼續探索了。
SendMessage還有兩個參數wParam和lParam。每個消息都具有這兩個參數,它們可能包括一些其他信息,其含義由具體的消息來決定的。比如,我們要調用的CB_SETDROPPEDWIDTH消息,其wParam 表示要設置下拉部分的寬度是多少,以像素為單位;而lParam參數沒有使用,必須設置為0。
可能你已經注意到了,這裡SendMessage中的lParam定義為Any類型。前面我們已經提到,指定 Any類型禁止Visual Basic進行類型檢查,從而允許將任意數據類型傳遞給該過程。由於每條消息對參數的類型和傳遞方式的要求都不同:有的可能要求為Long型,有的可能要求為自定義類型;大多數要求按傳值方式傳遞,但也有一些要求按傳地址方式。為了滿足各種要求,我們將這個參數定義為Any類型。比如,我們要傳遞一個 Long型變量lData。如果消息要求傳地址方式傳遞,可以使用:
SendMessage ……, lData
而如果要求傳值方式傳遞,則使用
SendMessage ……, ByVal lData
如果傳遞常數,我們則需要使用類型後綴來指定常數的類型,比如"0&",表示Long型的常數0,如
SendMessage ……, ByVal 0&
我們也可以使用類型轉換函數CLng將常數指定為Long型,如CLng(0)。
訂閱:
張貼留言 (Atom)
0 留言:
張貼留言