Определение того, какая клавиатура отправляет нажатия клавиш - PullRequest
2 голосов
/ 27 августа 2009

У меня есть 2 клавиатуры, подключенные к моей машине (одна на PS / 2, другая на USB). Как определить, какая клавиатура отправляет нажатия клавиш в C #?

Ответы [ 5 ]

3 голосов
/ 27 августа 2009

Вот пример очень грязного кода, показывающий, как использовать хук ввода Windows из .NET. Лучше всего работает с компилятором Snippet:>

РЕДАКТИРОВАТЬ: оказывается, есть ограничение длины для сообщений,

получить исходный код из кода здесь

.

2 голосов
/ 27 августа 2009

Если кто-то подключен к USB, то вы сможете это выяснить - по крайней мере, на уровне драйвера. Однако выше стека я не слышал о такой опции. Я не удивлюсь, если это вообще будет невозможно.

Одной из авеню, которую вы можете проверить, являются танцевальные симуляторы. Вы знаете, те, с "танцевальным ковриком" (или "танцевальной площадкой"). Эти танцевальные маты на самом деле не что иное, как большие клавиатуры. Проверьте сами - откройте блокнот и запрыгните на танцевальный коврик. :)

Теперь некоторые из этих программ также предлагают режим соревнования, где вы можете подключить два танцевальных мата и соревноваться с партнером. В этом случае им нужно будет как-то различать маты - это то же самое, что вы пытаетесь сделать.

1 голос
/ 27 августа 2009

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

  1. Лента, склейка или короткое замыкание набора клавиш-модификаторов (например, правый Ctrl) на одной из клавиатур.
  2. При каждом нажатии клавиши посмотрите на модификаторы. Если модификаторы установлены так, как если бы они были на приклеенной клавиатуре, предположим, что клавиатура является источником. Если нет, предположим, что это другая клавиатура.

Ограничения:

  1. Вы не можете использовать приклеенную клавиатуру вне вашего приложения, поскольку только она знает, что игнорирует клавиши-модификаторы.
  2. Вы не можете использовать эти клавиши-модификаторы в своем собственном приложении как часть сочетаний клавиш.
  3. Другая клавиатура может выдать себя за вашу (случайно или нет), если пользователь нажмет правильные кнопки.
  4. Вам нужно будет отключить StickyKeys.
  5. Использование Alt или Ctrl имеет обратную сторону: если вы нажмете другой , Windows может использовать эту комбинацию, которую ваше приложение не поймает.

Неизвестно # 1 : заполняется ли ModifierKeys только с клавиатуры, которая была источником нажатия клавиши, или из суммы всех модификаторов на всех подключенных клавиатурах. Я подозреваю, каждая клавиатура внутренне отправляет модификаторы, прикрепленные к нажатию клавиши, и что Windows не объединяет их.

Неизвестно # 2 : независимо от того, предоставляет ли System.Windows.Forms.Control.ModifierKeys только биты Ctrl / Shift / Alt или предоставляет достаточно деталей, чтобы, скажем, различать Правая клавиша Ctrl слева. Вот ключи, которые вы могли бы теоретически проверить, я не знаю, сколько из них предоставляется с помощью ModifierKeys:

http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

1 голос
/ 27 августа 2009

Я предполагаю, что проблема в том, что при использовании сканера штрих-кода номер входит в активное поле, а не в поле для идентификатора штрих-кода?

Одним из решений было бы перехватить события OnChange других полей и найти номер штрих-кода, вставленный в них (через RegEx). Если найдено, переместите штрих-код из этого поля и переместите значение в поле штрих-кода.

Доступ к устройству не требуется, это можно сделать даже на веб-странице, управляемой Javascript.

0 голосов
/ 27 августа 2009

Я думаю, что единственный способ сделать это - следить за трафиком USB. Я видел программы, которые делают это, но я понятия не имею, как это сделать в C #. Таким образом, если есть трафик USB и нажатие клавиши, это клавиатура USB. Если трафика нет, то это PS / 2.

Естественно, другая оговорка, заключающаяся в том, что она не распространяется на произвольные или будущие типы подключения клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...