Задача такая: различить с какой из клавиатур пришло событие нажатия кнопки и блокировать его для одной из них.
Пример: ноутбук со встроенной клавиатурой и подключенная внешняя USB клавиатура. Встроенная работает как обычно, ввод с внешней блокируется (одновременно с блокировкой производятся некоторые действия, в зависимости от нажатой кнопки; получается эдакий USB-контроллер).
Проштудировав SetWindowsHookEx понял, что различить с какой именно клавиатуры пришло событие нажатие невозможно, других способов в юзер-може не знаю (если кто знает, подскажите, это сильно облегчит задачу).
Вариант на котором остановился — самописный фильтр-драйвер, на основе kbfiltr: ловит нажатия, очищает очередь, тем самым блокируя ввод с точки зрения системы. Проблема только в том, что для работы этого драйвера нужно стандартный драйвер определенной клавиатуры заменить на этот. Если нужно несколько клавиатур-контроллеров, то драйвер каждой клавы нужно заменить.
Вопрос такой, можно ли сделать такой драйвер, который не привязывался бы к конкретной железке-клавиатуре, а устанавливался бы однократно в системе и ловил ввод от всех клавиатур? По параметру KEYBOARD_INPUT_DATA::UnitId как я понимаю можно определить от какой клавиатуры пришло событие.
Спасибо.
натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда.
Код чтения написал, работает, только под рукой одна клавиатура проверить не могу.
Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.
Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...
BR>Спасибо. BR>натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда. BR>Код чтения написал, работает, только под рукой одна клавиатура проверить не могу. BR>Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.
BR>Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...
Или я ошибаюсь, что для каждой физической клавиатуры загружается новый \Device\KeyboardClass с уникальным номером?
Здравствуйте, brain-ripper, Вы писали:
BR>Здравствуйте, brain-ripper, Вы писали:
BR>>Здравствуйте, -prus-, Вы писали:
P>>>Здравствуйте, brain-ripper, Вы писали:
P>>>...
P>>>Посмотрите эту ветку
BR>>Спасибо. BR>>натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда. BR>>Код чтения написал, работает, только под рукой одна клавиатура проверить не могу. BR>>Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.
BR>>Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...
BR>Или я ошибаюсь, что для каждой физической клавиатуры загружается новый \Device\KeyboardClass с уникальным номером?
хотя рано я радовался... если в цикле считывать нажатия кнопок из хэндла открытого по \Device\KeyboardClass0 — часть нажатий не доходят до системы...
какой-то закономерности выявить не удалось
Здравствуйте, brain-ripper, Вы писали:
BR>Здравствуйте, brain-ripper, Вы писали:
BR>>Здравствуйте, brain-ripper, Вы писали:
BR>>>Здравствуйте, -prus-, Вы писали:
P>>>>Здравствуйте, brain-ripper, Вы писали:
P>>>>...
P>>>>Посмотрите эту ветку
BR>>>Спасибо. BR>>>натолкнуло на мысль использовать в юзер-моде открытие клавиатуры по имени "\Device\KeyboardClassN" и читать ввод прямо оттуда. BR>>>Код чтения написал, работает, только под рукой одна клавиатура проверить не могу. BR>>>Странно, что в системе 2 драйвера загружено — KeyboardClass0 и KeyboardClass1, хотя физически клавиатура одна.
BR>>>Т.е. перехват ввода от определенной клавиатуры, можно сказать, сделано, а вот, как сделать, чтоб ввод дальше в систему не проходил, пока не придумал...
BR>>Или я ошибаюсь, что для каждой физической клавиатуры загружается новый \Device\KeyboardClass с уникальным номером?
BR>хотя рано я радовался... если в цикле считывать нажатия кнопок из хэндла открытого по \Device\KeyboardClass0 — часть нажатий не доходят до системы... BR>какой-то закономерности выявить не удалось
похоже, что то, что не успевает вычитаться в юзер-моде через NtReadFile — уходит в систему...
так что этот способ не подходит.