Как различать ввод с разных клавиатур
От: brain-ripper  
Дата: 27.01.10 09:14
Оценка:
Здравствуйте.

Задача такая: различить с какой из клавиатур пришло событие нажатия кнопки и блокировать его для одной из них.
Пример: ноутбук со встроенной клавиатурой и подключенная внешняя USB клавиатура. Встроенная работает как обычно, ввод с внешней блокируется (одновременно с блокировкой производятся некоторые действия, в зависимости от нажатой кнопки; получается эдакий USB-контроллер).

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

Вариант на котором остановился — самописный фильтр-драйвер, на основе kbfiltr: ловит нажатия, очищает очередь, тем самым блокируя ввод с точки зрения системы. Проблема только в том, что для работы этого драйвера нужно стандартный драйвер определенной клавиатуры заменить на этот. Если нужно несколько клавиатур-контроллеров, то драйвер каждой клавы нужно заменить.

Вопрос такой, можно ли сделать такой драйвер, который не привязывался бы к конкретной железке-клавиатуре, а устанавливался бы однократно в системе и ловил ввод от всех клавиатур? По параметру KEYBOARD_INPUT_DATA::UnitId как я понимаю можно определить от какой клавиатуры пришло событие.
Re: Как различать ввод с разных клавиатур
От: -prus-  
Дата: 28.01.10 09:05
Оценка:
Здравствуйте, brain-ripper, Вы писали:

...

Посмотрите эту ветку
Автор: -prus-
Дата: 18.10.08
, может поможет.
С уважением,
Евгений
Re[2]: Как различать ввод с разных клавиатур
От: brain-ripper  
Дата: 28.01.10 11:33
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Здравствуйте, brain-ripper, Вы писали:


P>...


P>Посмотрите эту ветку
Автор: -prus-
Дата: 18.10.08
, может поможет.



Спасибо.
натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда.
Код чтения написал, работает, только под рукой одна клавиатура проверить не могу.
Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.

Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...
Re[3]: Как различать ввод с разных клавиатур
От: brain-ripper  
Дата: 28.01.10 11:36
Оценка:
Здравствуйте, brain-ripper, Вы писали:

BR>Здравствуйте, -prus-, Вы писали:


P>>Здравствуйте, brain-ripper, Вы писали:


P>>...


P>>Посмотрите эту ветку
Автор: -prus-
Дата: 18.10.08
, может поможет.



BR>Спасибо.

BR>натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда.
BR>Код чтения написал, работает, только под рукой одна клавиатура проверить не могу.
BR>Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.

BR>Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...


Или я ошибаюсь, что для каждой физической клавиатуры загружается новый \Device\KeyboardClass с уникальным номером?
Re[4]: Как различать ввод с разных клавиатур
От: brain-ripper  
Дата: 28.01.10 12:05
Оценка:
Здравствуйте, brain-ripper, Вы писали:

BR>Здравствуйте, brain-ripper, Вы писали:


BR>>Здравствуйте, -prus-, Вы писали:


P>>>Здравствуйте, brain-ripper, Вы писали:


P>>>...


P>>>Посмотрите эту ветку
Автор: -prus-
Дата: 18.10.08
, может поможет.



BR>>Спасибо.

BR>>натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда.
BR>>Код чтения написал, работает, только под рукой одна клавиатура проверить не могу.
BR>>Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.

BR>>Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...


BR>Или я ошибаюсь, что для каждой физической клавиатуры загружается новый \Device\KeyboardClass с уникальным номером?


хотя рано я радовался... если в цикле считывать нажатия кнопок из хэндла открытого по \Device\KeyboardClass0 — часть нажатий не доходят до системы...
какой-то закономерности выявить не удалось
Re[5]: Как различать ввод с разных клавиатур
От: brain-ripper  
Дата: 28.01.10 13:08
Оценка:
Здравствуйте, brain-ripper, Вы писали:

BR>Здравствуйте, brain-ripper, Вы писали:


BR>>Здравствуйте, brain-ripper, Вы писали:


BR>>>Здравствуйте, -prus-, Вы писали:


P>>>>Здравствуйте, brain-ripper, Вы писали:


P>>>>...


P>>>>Посмотрите эту ветку
Автор: -prus-
Дата: 18.10.08
, может поможет.



BR>>>Спасибо.

BR>>>натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда.
BR>>>Код чтения написал, работает, только под рукой одна клавиатура проверить не могу.
BR>>>Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.

BR>>>Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...


BR>>Или я ошибаюсь, что для каждой физической клавиатуры загружается новый \Device\KeyboardClass с уникальным номером?


BR>хотя рано я радовался... если в цикле считывать нажатия кнопок из хэндла открытого по \Device\KeyboardClass0 — часть нажатий не доходят до системы...

BR>какой-то закономерности выявить не удалось

похоже, что то, что не успевает вычитаться в юзер-моде через NtReadFile — уходит в систему...
так что этот способ не подходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.