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