2012-08-06 56 views
1

我正在使用磁卡讀卡器。當使用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

有誰知道爲什麼會發生這種情況,爲什麼它在記事本中正常工作?更重要的是,我如何解決/解決它?謝謝。

回答

4

您正在使用低級別的鍵盤掛鉤,它可以在線程中運行。因此,當您撥打GetKeyboardState時,您將獲得您自己的本地鍵盤的狀態,而不是記事本鍵盤的狀態。如果您想沿着這條路線繼續行駛,您需要手動跟蹤換檔鍵狀態。爲什麼不在應用程序中處理正常的鍵盤消息?爲什麼你需要一個全局鉤子?如果您正常處理它們,則會發生切換鍵處理,當您撥打GetKeyboardState時,您將看到相應的鍵狀態。將原始鍵盤活動轉換成鍵入字符是非常困難的。除了切換鍵狀態之外,您還需要擔心Caps Lock和IME。

+0

感謝您的回答。該應用程序作爲一個多應用程序的信息亭運行,我們希望檢測所有按鍵(或讀取器輸入),因此掛鉤。手動檢測SHIFT似乎解決了這個問題。 – user1579177 2012-08-06 15:22:36

+0

幸運的是,這是一個自助服務終端,您可以控制鍵盤並確保它是美式英語。其他語言的轉換狀態要困難得多。 (請注意,即使是美式英語,您也需要擔心Caps Lock,Ctrl,Alt和Num Lock。) – 2012-08-06 15:25:58

+2

只需使用GetAsyncKeyState即可。它將正確檢索修改鍵(shift,control,alt)的值,無論哪個窗口處於活動狀態。 GetKeyboardState無法通過線程問題檢索它們。另一方面,GetAsyncKeyState獲取鍵的物理屬性,所以它不會返回Caps,Num和Scroll的切換狀態。使用GetAsyncKeyState(填充字節數組)循環所有鍵後,調用GetKeyState以獲得大寫字母,滾動和數字鎖定,並檢查其切換位(最低有效位),並覆蓋主數組中的值。 – Triynko 2015-06-25 05:17:45