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

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

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

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

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

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

Я ответил на этот вопрос здесь: Как определить устройство ввода, если включены и мышь, и тачпад. В ответе используется библиотека c и созданные мной драйверы.

pepper_chico 16.02.2012 23:23

Не совсем ответ на мой вопрос. Ответ, помеченный как правильный, отлично работал в течение нескольких лет.

Ray Hayes 24.02.2012 15:28

@ ray-haves Можете ли вы подтвердить, можете ли вы запретить ввод из изготовление для других приложений даже после того, как вы его отфильтровали. То есть, когда нажатие клавиши фильтруется через необработанный ввод, можно ли остановить его обработку остальной частью операционной системы?

pepper_chico 24.02.2012 23:14

извините, не та цель, @ ray-hayes

pepper_chico 24.02.2012 23:41

@Chico, нет, это не мешает распространению ключа в другие приложения. Но мой вопрос был не в этом. У меня было специальное аппаратное устройство, которое должно было передавать нажатия клавиш приложению (в полноэкранном режиме на отдельном мониторе) независимо от того, было ли оно сфокусировано или нет. Конечно, если они будут играть с клавишами, когда сфокусированы на Microsoft Word, они получат необычные результаты, но, как оказалось, это не очень похоже из-за того, как все устроено физически. Хотя ваш ответ может быть лучше, реализованный вариант пока работает нормально! ;-)

Ray Hayes 27.02.2012 19:51

Спасибо за подтверждение такого поведения ;-)

pepper_chico 27.02.2012 21:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
6
16 329
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ну что ж, обидно. Я собираюсь обратиться к производителям устройств и посмотреть, есть ли способ перепрограммировать оборудование для использования различных кодов клавиш (надеюсь, с высокими числами VK_Fn).

Ray Hayes 18.09.2008 14:36

Непринятие этого, поскольку это действительно похоже на то, что это возможно без драйвера на основе ответа A Nony Mouse.

Ray Hayes 18.09.2008 15:10
Ответ принят как подходящий

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

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

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

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

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

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

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

У меня аналогичная проблема, когда мне нужно получить несколько событий касания. есть ли у вас более подробный пример?

user1865027 04.08.2017 05:05

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