Несколько клавиатур и крючки низкого уровня

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

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

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

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

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


person Ray Hayes    schedule 18.09.2008    source источник
comment
Я ответил на этот вопрос здесь: Как определить устройство ввода, если включены мышь и сенсорная панель. В ответе используется библиотека c и созданные мной драйверы.   -  person pepper_chico    schedule 16.02.2012
comment
Не совсем ответ на мой вопрос. Ответ, помеченный как правильный, отлично работал в течение нескольких лет.   -  person Ray Hayes    schedule 24.02.2012
comment
@ ray-haves Можете ли вы подтвердить, что можете запретить создание ввода для других приложений даже после того, как вы его отфильтровали. То есть, когда нажатие клавиши фильтруется через необработанный ввод, можно ли остановить его обработку остальной частью операционной системы?   -  person pepper_chico    schedule 24.02.2012
comment
извините, не та цель, @ ray-hayes   -  person pepper_chico    schedule 24.02.2012
comment
@Chico, нет, это не мешает распространению ключа в другие приложения. Но мой вопрос был не в этом. У меня было специальное аппаратное устройство, которое должно было передавать нажатия клавиш приложению (в полноэкранном режиме на отдельном мониторе) независимо от того, было ли оно сфокусировано или нет. Конечно, если они будут играть с клавишами, когда сфокусированы на Microsoft Word, они получат необычные результаты, но, как оказалось, это не очень похоже из-за того, как все устроено физически. Хотя ваш ответ может быть лучше, реализованный вариант пока работает отлично! ;-)   -  person Ray Hayes    schedule 27.02.2012
comment
Спасибо за подтверждение такого поведения ;-)   -  person pepper_chico    schedule 27.02.2012


Ответы (2)


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

Вот моя попытка наверстать упущенное :):

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

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

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

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

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

person Roel    schedule 18.09.2008
comment
У меня аналогичная проблема, когда мне нужно получить несколько событий касания. есть ли у вас более подробный пример? - person user1865027; 04.08.2017

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

person Roel    schedule 18.09.2008
comment
Ну что ж, обидно. Я собираюсь обратиться к производителям устройств и посмотреть, есть ли способ перепрограммировать оборудование для использования других кодов клавиш (надеюсь, с высокими числами VK_Fn). - person Ray Hayes; 18.09.2008
comment
Непринятие этого, поскольку это действительно похоже на то, что это возможно без драйвера на основе ответа A Nony Mouse. - person Ray Hayes; 18.09.2008