Несколько клавиатур и низкоуровневые крючки - PullRequest
13 голосов
/ 18 сентября 2008

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

  1. У меня обычный компьютер и клавиатура USB
  2. У меня есть внешний экран VGA с некоторыми жесткими клавишами
  3. Жесткие клавиши отображаются как стандартная клавиатура USB, отправляя ограниченное количество кодов клавиш (F1, F2, Return, + и -)

У меня есть низкоуровневая ловушка (в C #, но на самом деле вызывающая функциональность Win32), которая может обрабатывать ввод, даже когда мое приложение не сфокусировано.

Проблема в том, что при использовании обычной клавиатуры некоторые из отображенных кодов клавиш воспринимаются приложением на внешнем экране. Одно из нажатий клавиш, отправляемых внешним экраном и используемых для подтверждения, - VK_RETURN. Если я не могу определить «устройство» и отфильтровать его, пользователь может выполнять действия и подтверждать их на экране, на которые они даже не смотрят.

Как узнать, какая клавиатура была ответственна за нажатие клавиши?

Ответы [ 2 ]

15 голосов
/ 18 сентября 2008

Да, я исправляюсь, мой плохой, каждый день узнаю что-то новое.

Вот моя попытка восполнить это :):

  • Зарегистрируйте устройства, которые вы хотите использовать для необработанного ввода (две клавиатуры), с помощью :: RegisterRawInputDevices ().

  • Вы можете получить эти устройства из GetRawInputDeviceList ()

  • После того, как вы зарегистрируете свои устройства, вы начнете получать сообщения WM_INPUT.

  • Параметр lParam сообщения WM_INPUT содержит структуру RAWKEYBOARD, которую можно использовать для определения клавиатуры, откуда поступил ввод, плюс виртуальный код клавиши и тип сообщения (WM_KEYDOWN, WM_KEYUP, ...)

  • Таким образом, вы можете установить флаг того, откуда пришло последнее сообщение, а затем отправить его обычным обработчикам ввода с клавиатуры.

0 голосов
/ 18 сентября 2008

Нет способа сделать это. Windows делает это за вас. Как уже упоминалось, вам нужно написать / изменить драйвер устройства.

...