C#模擬鍵盤輸入、鍵狀態(tài)和監(jiān)聽鍵盤消息
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
模擬鍵盤輸入模擬鍵盤輸入的功能需要依賴Windows函數(shù)實現(xiàn),這個函數(shù)是SendInput,它是專門用來模擬鍵盤、鼠標(biāo)等設(shè)備輸入的函數(shù)。 另外和鍵盤輸入相關(guān)的函數(shù)還有SendKeys,它是System.Windows.Forms. SendKeys,只能在WinFrom項目中使用,并且它的所有功能都可以由SendInput來實現(xiàn)。 另一個是keybd_event函數(shù),這個函數(shù)依然是有用的,但是目前官方已經(jīng)推薦使用SendInput替代它了。 SendInput的定義INPUT對象中保存了輸入內(nèi)容,nInputs和cbSize代表pInputs的長度和INPUT結(jié)構(gòu)的大小,這兩個參數(shù)能幫助SendInput正確解析INPUT對象。返回值0表示失敗,非零表示正確執(zhí)行。
INPUT的定義INPUT結(jié)構(gòu)中的type表示消息類型,值為1表示鍵盤消息。mkhi表示具體的消息內(nèi)容,它可以模擬三類消息,其中鍵盤消息使用KEYBDINPUT表示,其它消息類型的結(jié)構(gòu)不在這里介紹(雖然用不到MOUSEINPUT等結(jié)構(gòu),但是它們的定義不能省略,否則SendInput無法正確解析INPUT中的具體內(nèi)容)。 FieldOffset(0)將三個結(jié)構(gòu)的起始都放在0位置,所以只能使用其中一個內(nèi)容,因為一個INPUT也只能表示一個消息,這樣設(shè)計可以節(jié)省空間。 KEYBDINPUT結(jié)構(gòu)中的wVK表示虛擬鍵碼 ,dwFlags的第一位bit默認(rèn)0表示鍵盤按下事件,1表示鍵盤釋放事件。 虛擬鍵碼是一種能讓W(xué)indows以與設(shè)備無關(guān)的方式處理鍵盤的技術(shù),可以簡單理解為:鍵盤上的每個鍵用一個數(shù)字來表示。
模擬A鍵A鍵的虛擬鍵碼是0x41。type=1表示這是鍵盤消息,dwFlags=2表示鍵盤釋放事件。 這里INPUT數(shù)組模擬的就是使用物理鍵盤A鍵的過程。inputs[0]模擬A鍵按下,inputs[1]模擬A鍵釋放。
模擬Ctrl+A0x11是Ctrl的虛擬鍵碼,這里模擬了按下Ctrl鍵,按下A鍵,釋放A鍵,釋放Ctrl鍵的過程,實現(xiàn)了Ctrl+A的組合鍵效果。
SendInput除了能模擬擊鍵消息外還可以在文本輸入中模擬字符消息。 KEYBDINPUT結(jié)構(gòu)的wScan表示字符內(nèi)容,將dwFlags的第二位bit置1表示使用wScan屬性而非wVK。 文本輸入
鍵狀態(tài)有時需要知道鍵盤按鍵的當(dāng)前狀態(tài),可以使用GetKeyState函數(shù)。 GetKeyState的定義 參數(shù)是鍵的虛擬碼,對于開關(guān)鍵(Caps Look、Num Lock和Scroll Lock),返回值1表示開啟狀態(tài)。對于其它鍵返回負(fù)數(shù)表示按下狀態(tài)。 CapsLock鍵狀態(tài)
監(jiān)聽鍵盤消息對于WinForm和WPF程序,要監(jiān)聽輸入到本程序的鍵盤消息直接使用窗口的KeyDown和KeyUp事件即可。 對于其它鍵盤消息(即給本程序以外的鍵盤消息),需要使用鉤子(hook)。 鉤子是Windows系統(tǒng)消息處理機(jī)制中的一個節(jié)點,可以安裝鉤子來監(jiān)聽系統(tǒng)中的Windows消息。 Windows消息分很多種,對于特定的一類消息需要使用對應(yīng)的特定類型的鉤子,這里只介紹鍵盤消息的鉤子。 鉤子的安裝需要調(diào)用系統(tǒng)SetWindowsHookEx方法。
SetWindowsHookEx的定義idHook等于13表示全局鍵盤消息鉤子,lpfn代表鍵盤消息處理程序,返回非IntPtr.Zero表示安裝成功。
安裝鉤子KeyboardHookCallback就是自定義的具體處理鍵盤消息的方法。
消息處理從lParam中讀取鍵的虛擬碼(lParam其實是指向類似前文提到的KEYBDINPUT結(jié)構(gòu)的指針),wParam表示擊鍵事件的類型。CallNextHookEx將消息傳遞給下一個消息處理節(jié)點。 使用前文提到的SendInput方法模擬鍵盤輸入也能被鉤子監(jiān)聽到。 應(yīng)避免在消息處理過程中進(jìn)行耗時操作。
卸載鉤子需要使用UnhookWindowsHookEx UnhookWindowsHookEx的定義 傳入SetWindowsHookEx的返回值即可,返回true則卸載成功。 作者:左眼水星 該文章在 2024/8/19 8:44:18 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |