|
向任意應(yīng)用程序(包括后臺的)發(fā)送任意按鍵消息(包括普通字符鍵、功能鍵、Shift/Control/Alt加任意按鍵的組合鍵),以實(shí)現(xiàn)自動執(zhí)行特定功能,是一個用途很廣、很有實(shí)用價值的功能,很多人都受困于此,不得其解,本人也遇到這種需求并受阻。剛開始查了很多資料和網(wǎng)上網(wǎng)友的解決方案,有些能起到一定作用,但也有許多方案經(jīng)試驗(yàn)證實(shí)不可行。尤其是關(guān)于發(fā)送 Shift/Control/Alt 加任意按鍵的組合鍵這個問題,沒有發(fā)現(xiàn)一個可行的方案,例如以下代碼并不能向指定Window(hwnd)發(fā)送 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鍵 上例只能發(fā)送一個小寫字母c。 以下代碼雖可以模擬 Ctrl+C 按鍵,但卻不能向指定的后臺窗口發(fā)送: keybd_event VK_Ctrl, 0, 0, 0 '按下Ctrl鍵 keybd_event VK_C, 0, 0, 0 '按下C鍵 keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '釋放C鍵 keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '釋放Ctrl鍵 難道真的沒有解決這個問題的辦法嗎?我想這個應(yīng)該是可以做到的呀!后來經(jīng)過反復(fù)的研究Windows的消息機(jī)制和鍵盤輸入系統(tǒng)調(diào)用的資料,終于找到了解決方案,并經(jīng)試驗(yàn)成功證實(shí)。自己也是曾經(jīng)受困于此,終得其解,不敢獨(dú)享,現(xiàn)拿出來獻(xiàn)給廣大同需此求的朋友,也讓這個問題不再是少數(shù)“高手”們獨(dú)享的秘籍。 要實(shí)現(xiàn)向任意應(yīng)用程序窗口發(fā)送模擬的按鍵,在不需激活該應(yīng)用程序使其獲得輸入焦點(diǎn)的情況下,首先必須取得要接收按鍵的窗口句柄,這要用到Windows API FindWindow 及 FindWindowEx,首先用 FindWindow 取得應(yīng)用程序頂層(Top Level)窗口的句柄,然后再用 FindWindowEx 取得要接收按鍵的子窗口或控件的句柄,因?yàn)閼?yīng)用程序頂層窗口不一定就是接受按鍵的窗口(如“NotePad.exe”記事本程序,實(shí)際接受按鍵的窗口是Notepad主窗口下的Edit控件),可以通過ClassID或Caption來查找。假設(shè)目標(biāo)窗口的句柄已取得(hwnd),然后要用PostMessage向該窗口發(fā)送按鍵消息,對于普通字符鍵,直接用WM_CHAR消息最簡單,如下: PostMessage hwnd, WM_CHAR, Asc("A"), 0 ' 發(fā)送一個 A 字符 對于非普通字符按鍵,如功能鍵、方向鍵等,要用 WM_KEYDOWN、WM_KEYUP 消息,如下: PostMessage hWndMsg, WM_KEYDOWN, VK_ESCAPE, &H00010001 ' 模擬按下 Esc 鍵 PostMessage hWndMsg, WM_KEYUP, VK_ESCAPE, &HC0010001 ' 模擬抬起 Esc 鍵 以上最后一個參數(shù)(lParam)低16位(0001)表示按鍵一次,高8位00表示按下,C0表示抬起,次高8位(01)表示該鍵的掃描碼,可用 API MapVirtualKey(VirtualKey, 0)取得(注意:掃描碼在各系統(tǒng)可能會不同,在此以具體數(shù)值示例,實(shí)際應(yīng)用MapVirtualKey取得)。 下面要講Shift/Control/Alt修飾鍵與其它按鍵的組合怎樣發(fā)送,對于Shift和Control用以下方式(用到 API keybd_event): keybd_event VK_SHIFT, &H2A, 0, 0 ' 模擬按下SHIFT鍵,&H2A是VK_SHIFT的掃描碼 PostMessage hWndMsg, WM_KEYDOWN, VK_A, &H001E0001 ' 模擬按下 A 鍵,SHIFT+A產(chǎn)生一個大寫A字符 PostMessage hWndMsg, WM_KEYUP, VK_A, &HC01E0001 ' 模擬抬起 A 鍵 keybd_event VK_SHIFT, &H2A, KEYEVENTF_KEYUP, 0 ' 模擬抬起 SHIFT 鍵 以上VK_SHIFT(掃描碼2A)換成VK_CONTROL(掃描碼1D)就可以實(shí)現(xiàn)Ctrl組合鍵,VK_A(掃描碼1E)也可以換成任意功能鍵,如VK_F4(掃描碼3E)。 對于Alt修飾鍵比較特別,它屬于系統(tǒng)按鍵,要用 WM_SYSKEYDOWN/WM_SYSKEYUP 消息,如下: PostMessage hWndMsg, WM_SYSKEYDOWN, VK_F4, &H003E0001 Or &H20000000 ' 模擬按下 Alt+F4 PostMessage hWndMsg, WM_SYSKEYUP, VK_F4, &HC03E0001 Or &H20000000 ' 模擬抬起 Alt+F4 ' &H20000000 為 context code 位,置 1 表示 Alt 鍵被按下 至此,大功告成!祝各位心情愉快! |
|
|