我正在使用磁卡讀卡器。當使用Windows鍵盤掛鉤時,SHIFT鍵在鍵盤狀態下檢測不正確
當插入USB端口,並開放記事本,我得到以下,正確的結果:
%B4290071074381429^NAZARKO/C M ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?
當我使用一個鍵盤鉤子(用C#)調用Windows API函數,我得到不一致的結果,例如:
%B42()071074381429^NAZARKO/C M ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?
正如你可以看到,這裏的問題是,第一個「90」變爲「()」,彷彿當「9」和「0」鍵被擊中按下SHIFT。
鍵盤鉤子代碼是從這裏(Keyboard.cs): https://nappybar.googlecode.com/svn/Keyboard.cs ,它是建立在以下方式:
_kbHook = new KeyboardHook();
_kbHook.KeyIntercepted += KeyboardHook_KeyIntercepted;
_kbHook.SetParameters(KeyboardHook.Parameters.AllowAltTab);
_kbHook.SetParameters(KeyboardHook.Parameters.PassAllKeysToNextApp);
如上所述,我用這與當得到結果讀卡器不一致。看起來(GetKeyboardState)的鍵盤狀態並不完全正確。 主要的是,它有時會說SHIFT在它不應該和其他方式時被按下。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299(v=vs.85).aspx
有誰知道爲什麼會發生這種情況,爲什麼它在記事本中正常工作?更重要的是,我如何解決/解決它?謝謝。
感謝您的回答。該應用程序作爲一個多應用程序的信息亭運行,我們希望檢測所有按鍵(或讀取器輸入),因此掛鉤。手動檢測SHIFT似乎解決了這個問題。 – user1579177 2012-08-06 15:22:36
幸運的是,這是一個自助服務終端,您可以控制鍵盤並確保它是美式英語。其他語言的轉換狀態要困難得多。 (請注意,即使是美式英語,您也需要擔心Caps Lock,Ctrl,Alt和Num Lock。) – 2012-08-06 15:25:58
只需使用GetAsyncKeyState即可。它將正確檢索修改鍵(shift,control,alt)的值,無論哪個窗口處於活動狀態。 GetKeyboardState無法通過線程問題檢索它們。另一方面,GetAsyncKeyState獲取鍵的物理屬性,所以它不會返回Caps,Num和Scroll的切換狀態。使用GetAsyncKeyState(填充字節數組)循環所有鍵後,調用GetKeyState以獲得大寫字母,滾動和數字鎖定,並檢查其切換位(最低有效位),並覆蓋主數組中的值。 – Triynko 2015-06-25 05:17:45