Можно ли проглотить ключ в Raw Input?

Я использую Raw Input API, потому что мне нужно по-разному реагировать на ключи с разных USB HID-устройств, даже если это один и тот же ключ.

Мое окно правильно получает сообщения WM_INPUT. Я могу получить структуру RAWKEYBOARD< /a> чтобы получить всю необходимую мне информацию.

Теперь я хочу, чтобы эти USB-устройства не могли переключать NumLock. Я надеюсь, что Raw Input API позволит мне проглотить нажатие клавиши NumLock?

Я попытался установить для сообщения WM_INPUT Result значение 1, но, похоже, это не дало результата.

(Я пишу это на C#, но поскольку это низкоуровневый Windows API, вам, вероятно, не нужны знания C# или .NET, чтобы ответить на этот вопрос.)

РЕДАКТИРОВАТЬ: Ах да, я также пытался использовать глобальный хук клавиатуры (SetWindowsHookEx), чтобы проглотить нажатие клавиши NumLock. К сожалению, как только я инициализирую Raw Input API, глобальный хук клавиатуры больше не вызывается, пока окно активно. Я также пытался установить глобальный хук после необработанного ввода, но тот же эффект.


person Timwi    schedule 23.02.2013    source источник


Ответы (3)


API необработанного ввода не поддерживает проглатывание нажатий клавиш.

Кроме того, он не взаимодействует с SetWindowsHookEx в рамках одного процесса. Как только Raw Input API инициализируется, хук отключается.

Решение состоит в том, чтобы использовать их в отдельных процессах. Один процесс может использовать SetWindowsHookEx для проглатывания нежелательных клавиш, а другой использует API необработанного ввода для обработки поступивших нажатий клавиш. Затем вы просто запускаете оба. Это сработало просто отлично для меня.

person Timwi    schedule 15.05.2013
comment
Используете ли вы хук WH_KEYBOARD или WH_KEYBOARD_LL? - person ViH; 07.05.2020

Как написано выше, прямой возможности нет, но можно сделать, комбинируя низкоуровневые клавиатурные хуки.

В моем случае мне нужно поймать код со сканера штрих-кода, чтобы это были только цифры и ENTER.

Мое решение заключается в том, что RawInput захватывает все клавиши только со сканера штрих-кода, а подключение клавиатуры захватывает только цифры 0-9 и ENTER и вообще не возвращает их. Затем внутри кода я решаю, нужно ли возвращать ключ или нет:

SendKeys.SendWait("{ENTER}");
person Tomasz Maj    schedule 21.04.2017
comment
Используете ли вы хук WH_KEYBOARD или WH_KEYBOARD_LL? - person ViH; 07.05.2020

Вы можете «проглотить» некоторые нажатия клавиш, только написав драйвер фильтра клавиатуры ядра. Итак, если вы все еще в этом, вам понадобится DDK.

person user1764961    schedule 11.05.2013