2012-10-16 137 views
2

我正在爲條碼掃描器製作「驅動程序」。延遲的全局鍵盤鉤

這個特定的掃描儀基本上是一個USB鍵盤,只要掃描了某物就會產生鍵擊。

我想找到一種方法來區分這些擊鍵與正確鍵盤發送的擊鍵。不幸的是,唯一不同的是,掃描儀在幾分之一秒內快速地產生鍵盤輸入和密鑰。

我看到它的方式是我必須建立一個全局鍵盤鉤子,攔截所有輸入,以某種方式存儲它,等待一小會兒,然後將這些鍵擊發送到鉤子鏈或者假設它們是掃描器生成並適當地處理它們。

但是,由於沒有使用鉤子的經驗,我不確定正確的做法。我可以在KeyboardProc()之外的其他某個線程中使用CallNextHookEx()來傳遞延遲按鍵事件嗎?或者我應該手動生成一個新的WM_KEYPRESS消息?也許有更好的方法去做這件事?

謝謝。

+0

這與[此問題]基本相同(http://stackoverflow.com/questions/12885897/block-keystrokes-from-a-specific-keyboard)。不幸的是,只有一半的答案。 – arx

+0

這個答案應該可以解決你的問題:http://stackoverflow.com/a/3060668/886887 –

+0

@HarryJohnston它應該,不幸的是存在這樣的事情,我似乎需要支持鍵盤/卡掃描儀組合;它註冊爲一個單一的設備,但同時發送常規鍵盤輸入和掃描代碼作爲難以區分的擊鍵: – obamator

回答

3

好的,這是我遇到類似問題時的解決方案。

首先,使用WH_KEYBOARD_LL鉤子而不是WH_KEYBOARD

二,使用SendInput() API函數將不需要的按鍵傳遞給活動窗口。

三,低級鍵盤掛鉤的回調函數有一個指向KBDLLHOOKSTRUCT的指針作爲參數之一;在其flags位字段中使用LLKHF_INJECTED位來區分真正的按鍵和您剛剛生成的按鍵。如果您偏執,並害怕別人可能會採取同樣的方法,請使用SendInput()結構中的dwExtraInfo成員和鉤子回調函數來區分由您和其他人注入的擊鍵。

第四,請注意,如果Windows 7處理輸入需要很長時間,則會傾向於默默解除低級掛鉤,因此要麼將掛鉤回調保持爲簡單且可能,並且確保將Windows消息隊列作爲在鉤住鉤子的線程中經常儘可能多;或者 - 如果你是一個不好的壞男孩 - 在HKCU\Control Panel\Desktop\[DWORD]LowLevelHooksTimeout有一個註冊表項,將它設置爲相當大的值也可能工作。