用VB模擬帶有修飾鍵的組合鍵

向任意應用程序(包括後臺的)發送任意按鍵消息(包括普通字符鍵、功能鍵、Shift/Control/Alt加任意按鍵的組合鍵),以實現自動執行特定功能,是一個用途很廣、很有實用價值的功能,但加任意組合鍵這個問題卻不得其解。查了很多資料和網上網友的解決方案,有些能起到一定作用,但也有許多方案經試驗證實不可行。尤其是關於發送 Shift/Control/Alt 加任意按鍵的組合鍵這個問題,沒有發現一個可行的方案。


例如以下代碼並不能向指定Window(hwnd)發送 Ctrl+C:
PostMessage hwnd,WM_KEYDOWN,VK_CONTROL,&H001D0001   '按下Ctrl鍵
PostMessage hwnd,WM_KEYDOWN,VK_C,&H002E0001         '按下C鍵
PostMessage hwnd,WM_KEYUP,VK_C,&HC02E0001           '釋放C鍵
PostMessage hwnd,WM_KEYUP,VK_CONTROL,&HC01D0001     '釋放Ctrl鍵


上例只能發送一個小寫字母c。


以下代碼雖可以模擬 Ctrl+C 按鍵,但卻不能向指定的後臺窗口發送:
keybd_event VK_Ctrl, 0, 0, 0 '按下Ctrl鍵
keybd_event VK_C, 0, 0, 0 '按下C鍵
Sleep 500 '延時500毫秒
keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '釋放C鍵
keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '釋放Ctrl鍵


要實現向任意應用程序窗口發送模擬的按鍵,在不需激活該應用程序使其獲得輸入焦點的情況下,首先必須取得要接收按鍵的窗口句柄,這要用到Windows API FindWindow 及 FindWindowEx,首先用 FindWindow 取得應用程序頂層(Top Level)窗口的句柄,然後再用 FindWindowEx 取得要接收按鍵的子窗口或控件的句柄,因爲應用程序頂層窗口不一定就是接受按鍵的窗口(如“notepad.exe”記事本程序,實際接受按鍵的窗口是記事本主窗口下的Edit控件),可以通過ClassID或Caption來查找。假設目標窗口的句柄已取得(hwnd),然後要用PostMessage向該窗口發送按鍵消息,對於普通字符鍵,直接用WM_CHAR消息最簡單,如下:
PostMessage hwnd, WM_CHAR, Asc("A"), 0   ' 發送一個 A 字符


對於非普通字符按鍵,如功能鍵、方向鍵等,要用 WM_KEYDOWN、WM_KEYUP 消息,如下:
PostMessage hwnd, WM_KEYDOWN, VK_ESCAPE, &H00010001  ' 模擬按下 Esc 鍵
PostMessage hwnd, WM_KEYUP, VK_ESCAPE, &HC0010001    ' 模擬擡起 Esc 鍵


以上最後一個參數(lParam)低16位(0001)表示按鍵一次,高8位00表示按下,C0表示擡起,次高8位(01)表示該鍵的掃描碼,可用 API MapVirtualKey(VirtualKey, 0)取得(注意:掃描碼在各系統可能會不同,實際應用MapVirtualKey取得)。


下面要講Shift/Ctrl/Alt修飾鍵與其它按鍵的組合怎樣發送,對於Shift和Ctrl用以下方式(用到 API keybd_event):


keybd_event VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0  ' 模擬按下SHIFT鍵,MapVirtualKey(VK_SHIFT, 0)是爲了取得SHIFT的掃描碼
PostMessage hwnd, WM_KEYDOWN, VK_A, &H001E0001 ' 按下 A 鍵,SHIFT+A產生一個大寫A字符
PostMessage hwnd, WM_KEYUP, VK_A, &HC01E0001   ' 釋放 A 鍵
keybd_event VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0    ' 釋放 SHIFT 鍵


以上VK_SHIFT(掃描碼2A)換成VK_CONTROL(掃描碼1D)就可以實現Ctrl組合鍵,VK_A(掃描碼1E)也可以換成任意功能鍵,如VK_F4(掃描碼3E)。




對於Alt修飾鍵比較特別,它屬於系統按鍵,要用 WM_SYSKEYDOWN/WM_SYSKEYUP 消息,如下:


PostMessage hwnd, WM_SYSKEYDOWN, VK_F4, &H003E0001 Or &H20000000 ' 模擬按下 Alt+F4
PostMessage hwnd, WM_SYSKEYUP, VK_F4, &HC03E0001 Or &H20000000   ' 模擬擡起 Alt+F4  '&H20000000 爲lParam 的第29位,置 1 表示 Alt 鍵被按下
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章