Клавиша 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.

Другие вопросы по тегам