[英]How to repeat key strokes with SendInput?
我正在用 VC++ 編寫一個小工具來記錄擊鍵以便稍后重播,這是一個宏記錄器。 它已經工作得很好,使用鍵盤鈎子 function 讀取每個按鍵和釋放事件。 回放與 SendInput() function 一起工作並且通常也可以正常工作 - 除了重復擊鍵。 每次松開后按幾次鍵是沒有問題的。 但是按住不放,對於要重復輸入的字符,可以記錄,但在某些應用中只能回放。 有些接受並多次輸入字符,有些只輸入一次。 (這是可重現的。)宏記錄器本身也可以通過其監控掛鈎看到在播放過程中按下的鍵只被按下了一次。
那么,如何讓 SendInput 發送單個鍵的多個后續擊鍵,而無需在其間自行添加鍵釋放事件? 發送一系列 [press] [press] [press]... [release] 並不總是有效。
您可以在一個 SendInput 調用中發送多個鍵,但您仍然需要在每個字符上設置 keyup 標志,以便在每種類型的擊鍵上獲得相同的結果。
如果你需要發送“aa”,你可以這樣做。
INPUT input[4];
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = 0;
input[0].ki.wScan = 'a';
input[0].ki.dwFlags = 0;
input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = 0;
input[1].ki.wScan = 'a';
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
input[2].type = INPUT_KEYBOARD;
input[2].ki.wVk = 0;
input[2].ki.wScan = 'a';
input[2].ki.dwFlags = 0;
input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = 0;
input[3].ki.wScan = 'a';
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, input, sizeof(INPUT));
我不確定您的確切擊鍵順序,但我最近遇到了類似的問題。 我編寫了一個小型 Win32 工具 [1] 來在按下全局快捷鍵時發送鍵。 當字符重復時,例如“aaabc”,重復的字符將丟失。 我嘗試了很多 KeyDown 和 KeyUp 的組合,但是重復的字符總是丟失。
然后我找到了這篇博文: https://batchloaf.wordpress.com/2014/10/02/using-sendinput-to-type-unicode-characters/
雖然作者沒有專門討論重復字符,但它啟發了我嘗試僅使用一個INPUT
結構的SendInput()
。 這種技術對我來說效果很好。
簡而言之:
INPUT
結構調用SendInput()
。z
,請嘗試以下操作:
ki.dwFlags = KEYEVENTF_UNICODE
ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP
ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP
[1] https://github.com/kevinarpe/win32/tree/master/send_input
許多人遇到 keyup 和 keydown 調用被“忽略”或“丟棄”的問題,並且很多人通過在兩者之間放置少量緩沖時間來解決他們的問題,以確保所有命令都被傳輸:
sendinput alt keydown
sendinput 3 keydown
sleep 50
sendinput 3 keyup
sendinput alt keyup
還有一個SendInput.SendWait命令....
干杯
據我所知,它的工作方式是,如果在一段時間內(重復延遲)接收到按鍵事件而沒有按鍵事件,則該鍵被視為“重復”,直到發生按鍵事件。
由於發送按下、按下、按下、釋放並不總是有效,您是否嘗試記錄按鍵和按鍵之間的時間,然后同時重復命令? 它成為實時的,但它應該以這種方式觸發相同的重復動作。
我想不出任何其他方法來結束與原始相同數量的“按鍵重復”,因為這些不會記錄為單獨的按鍵操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.