Как получать уведомления об активности мыши / клавиатуры без глобального перехвата?

У меня есть прозрачное окно (WS_EX_TRANSPARENT), плавающее наверху.

Всякий раз, когда происходит движение мыши (в любом месте экрана) или нажатие клавиатуры, необходимо отображать соответствующую информацию (например, положение мыши).

Можно ли фиксировать действия мыши / клавиатуры без использования глобального крючка? Антивирусное ПО почти всегда срабатывает ложные срабатывания при использовании глобальных перехватчиков.

Любая идея очень ценится.


person diandaolly    schedule 01.06.2011    source источник


Ответы (4)


Думаю, GetAsyncKeyState и GetCursorPos может помочь. Вероятно, у вас может быть поток, вызывающий эти функции каждые 300-500 мс и отправляющий сообщение в ваш основной поток.

person UltraInstinct    schedule 01.06.2011

Вы можете зарегистрироваться для получения необработанных входных сообщений через RegisterRawInputDevices . Взгляните здесь, в принятом ответе есть несколько ссылок RRUZ, один указывает на реализацию C #. Это работает с оконными сообщениями, никаких хуков.

(С помощью этого метода вы также получаете информацию о конкретном устройстве, с которого был получен ввод, чтобы вы могли различать несколько клавиатур. Именно сюда направлено большинство вопросов, имеющих в качестве ответа «используйте RegisterRawInputDevices» в качестве ответа. Но вы также можете использовать его, чтобы просто захватить ввод , не заботясь об источнике.)

person Heinrich Ulbricht    schedule 01.06.2011

Вы можете получать уведомления об активности клавиатуры / мыши (GetLastInputInfo), и я почти уверен, что вы можете узнать позицию курсора (GetMouseMovePointsEx). Если вам не нужны фактические движения клавиатуры, то это должно сработать. Если вы это сделаете, я не думаю, что это можно сделать ...

person Blazes    schedule 01.06.2011

LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); UInt32 lastInputTick = lastInputInfo.dwTime; return Environment.TickCount - (Int32)lastInputInfo.dwTime

Этот код (C #) возвращает время бездействия (клавиатура и мышь). Таким образом, у вас может быть время, поскольку пользователь неактивен.

person OhMyGeo    schedule 20.03.2014