Обнаружение имитации клавиатуры / мыши - PullRequest
1 голос
/ 29 декабря 2010

Есть ли способ обнаружить симулированный ввод с клавиатуры / мыши в Windows. Например, пользователь что-то набирает на своей клавиатуре против sendKeys / PostMessage / экранной клавиатуры. Есть ли способ, которым я могу различить два?

РЕДАКТИРОВАТЬ: Возможно, пример поможет. Я делаю игру и хочу отличить реальный ввод от WinAPI, синтезирующего сообщения клавиатуры / мыши.

Ответы [ 3 ]

4 голосов
/ 29 декабря 2010

Я могу ошибаться, но экранная клавиатура (и другие приложения, имитирующие пользовательский ввод), скорее всего, использует API SendInput:

SendInput работает на нижнем уровне стека ввода. Это всего лишь бэкдор в тот же механизм ввода, который используют драйверы клавиатуры и мыши, чтобы сообщить диспетчеру окон, что пользователь сгенерировал ввод. Источник: http://blogs.msdn.com/b/oldnewthing/archive/2010/12/21/10107494.aspx

Так что, вероятно, нет никакого способа определить, поступает ли ввод с "настоящей" клавиатуры или нет.

2 голосов
/ 23 октября 2018

Единственный способ провести различие между «реальным» вводом и «имитированным» вводом (при условии, что он генерируется с помощью keybd_event() / mouse_event() или SendInput()) - это использовать низкоуровневую клавиатуру / мышь с помощью SetWindowsHookEx().Обратные вызовы WH_KEYBOARD_LL и WH_MOUSE_LL предоставляют флаги INJECTED для имитации ввода.

1 голос
/ 22 ноября 2018

Начиная с Windows 8 есть функция GetCurrentInputMessageSource. Вы можете использовать его и проверить перечисление originId на следующее значение:

IMO_INJECTED - Входное сообщение было введено (через функцию SendInput) приложением, для которого атрибут UIAccess не установлен в TRUE в его файле манифеста.

...