Клавиша SHIFT неправильно обнаруживается в состоянии клавиатуры при использовании перехвата клавиатуры Windows
Я работаю со считывателем магнитных карт.
При подключении к USB-порту и открытии Блокнота я получаю следующий правильный результат:
%B4290071074381429^NAZARKO/C M ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?
Когда я использую клавиатуру (написанную на C#), которая вызывает функции Windows API, я получаю противоречивые результаты, например:
%B42()071074381429^NAZARKO/C M ^1302101000002024976000000000002?;4290071074381429=13021010000020204976?
Как видите, здесь проблема в том, что первый "90" становится "()", как если бы была нажата клавиша "SHIFT" при нажатии клавиш "9" и "0".
Код ловушки клавиатуры отсюда (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
Кто-нибудь знает, почему это происходит и почему он работает правильно в блокноте? И что еще более важно, как я могу исправить / обойти это? Спасибо.
1 ответ
Вы используете низкоуровневый хук клавиатуры, который работает в потоке. Поэтому, когда вы звоните GetKeyboardState
Вы получаете состояние своей локальной клавиатуры, а не состояние клавиатуры Блокнота. Если вы хотите продолжить движение по этому маршруту, вам необходимо отслеживать состояния клавиш Shift вручную. Почему бы просто не обрабатывать обычные сообщения клавиатуры в вашем приложении? Зачем вам нужен глобальный хук? Если вы обработаете их как обычно, то произойдет обработка клавиши Shift и при вызове GetKeyboardState
вы увидите соответствующие ключевые состояния. Преобразование необработанных действий клавиатуры в печатные символы общеизвестно сложно. В дополнение к смене состояний клавиш вам нужно беспокоиться о Caps Lock и IME.