Несколько клавиатур и низкоуровневых хуков
Вопрос
У меня есть система, в которой у меня несколько клавиатур, и мне действительно нужно знать, с какой клавиатуры выполняется нажатие клавиши.Чтобы объяснить настройку:
- У меня есть обычный компьютер и USB-клавиатура
- У меня есть внешний VGA-экран с несколькими жесткими клавишами
- Жесткие клавиши отображаются как стандартная USB-клавиатура, посылая ограниченное количество кодов клавиш (F1, F2, возврат, + и -).
У меня есть низкоуровневый хук (на C #, но на самом деле вызывающий функциональность Win32), который способен обрабатывать входные данные, даже когда мое приложение не сфокусировано.
Проблема в том, что при использовании обычной клавиатуры некоторые из отображенных кодов клавиш воспринимаются приложением, выводимым на внешний экран.Одним из нажатий клавиши, отправляемых внешним экраном и используемых для подтверждения, является VK_RETURN.Если я не смогу идентифицировать "устройство" и отфильтровать его, пользователь может выполнять действия и подтверждать их на экране, на который он даже не смотрит.
Как мне узнать, какая клавиатура отвечала за нажатие клавиши?
Решение
Да, я исправляюсь, моя ошибка в том, что каждый день узнаю что-то новое.
Вот моя попытка компенсировать это :) :
Зарегистрируйте устройства, которые вы хотите использовать для необработанного ввода (две клавиатуры), с помощью ::RegisterRawInputDevices().
Вы можете получить эти устройства из GetRawInputDeviceList()
После того, как вы зарегистрируете свои устройства, вы начнете получать сообщения WM_INPUT.
Параметр lParam сообщения WM_INPUT содержит структуру RAWKEYBOARD, которую можно использовать для определения клавиатуры, с которой был произведен ввод, плюс код виртуальной клавиши и тип сообщения (WM_KEYDOWN, WM_KEYUP, ...)
Таким образом, вы можете установить флаг того, откуда пришло последнее сообщение, а затем отправить его обычным обработчикам ввода с клавиатуры.
Другие советы
Нет никакого способа сделать это.Windows абстрагирует это для вас.Как уже упоминалось, вам необходимо написать / изменить драйвер устройства.