2012-08-06 4 views
1

자기 카드 판독기로 작업하고 있습니다.Windows 키보드 후크를 사용할 때 키보드 상태에서 SHIFT 키가 잘못 감지되었습니다

USB 포트 및 열기 메모장에 연결하면, 다음과 같은 올바른 결과를 얻을 : Windows API 함수를 호출

%B4290071074381429^NAZARKO/C M    ^1302101000002024976000000000002?;4290071074381429=13021010000020204976? 

내가 키보드 후크를 사용하는 경우 (C#으로 작성된이) 내가 할을 일관성없는 결과 예를 들면 : 당신이 볼 수 있듯이 '9'와이 '0'키를 누르 때 SHIFT를 누르면 것처럼

%B42()071074381429^NAZARKO/C M    ^1302101000002024976000000000002?;4290071074381429=13021010000020204976? 

, 여기에 문제는 '()'최초의 '90'이 될 것입니다. https://nappybar.googlecode.com/svn/Keyboard.cs 그것은 다음과 같은 방법으로 설정 :

키보드 후크 코드 (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에 전화하면 메모장의 키보드 상태가 아닌 자신의 로컬 키보드 상태가 표시됩니다. 이 경로를 따라 계속하려면 수동으로 시프트 키 상태를 추적해야합니다. 왜 응용 프로그램에서 일반 키보드 메시지를 처리하지 않는 것이 좋습니까? 글로벌 훅이 필요한 이유는 무엇입니까? 정상적으로 처리하면 Shift 키 처리가 발생하고 GetKeyboardState으로 전화하면 적절한 키 상태가 표시됩니다. 원시 키보드 활동을 유형화 된 문자로 변환하는 것은 아주 어렵습니다. 시프트 키 상태 외에도 Caps Lock 및 IME에 대해 걱정해야합니다.

+0

답변 해 주셔서 감사합니다. 응용 프로그램은 여러 응용 프로그램이있는 키오스크로 실행되며 모든 키 누름 (또는 판독기 입력)을 감지하므로 후크를 감지합니다. SHIFT 수동 감지로 문제가 해결 된 것 같습니다. – user1579177

+0

운 좋은 당신을 위해 키보드를 제어하고 그것이 영어 - 보장 할 수있는 키오스크입니다. 다른 언어의 쉬프트 상태는 훨씬 더 어렵습니다. (미국 영어에서도 Caps Lock, Ctrl, Alt 및 Num Lock에 대해 걱정할 필요가 있습니다.) –

+2

GetAsyncKeyState를 사용하면됩니다. 어떤 창이 활성인지에 관계없이 수정 자 키 (shift, control, alt) 값을 올바르게 검색합니다. GetKeyboardState가 스레딩 문제로이를 검색하지 못합니다. 반면에 GetAsyncKeyState는 키의 물리적 속성을 가져 오므로 Caps, Num 및 Scroll의 토글 상태를 반환하지 않습니다. GetAsyncKeyState (바이트 배열 채우기)로 모든 키를 반복 한 후 대문자, 스크롤 및 num lock에 대해 GetKeyState를 호출하고 토글 비트 (최하위 비트)를 확인하고 주 배열의 값을 덮어 씁니다. – Triynko