Глобальный хук клавиатуры с C ++ - PullRequest
4 голосов
/ 16 августа 2010

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

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

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 16 августа 2010

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

Нет, это не проблема. Глобальный хук требует DLL с обратным вызовом. Эта DLL вставляется во все запущенные процессы. Он будет оставаться загруженным в процессе до тех пор, пока вы не вызовете UnHookWindowsHookEx () или процесс не завершится, в зависимости от того, что произойдет раньше.

Обратите внимание, что вы также можете подключить клавиатуру с помощью WH_KEYBOARD_LL. Это не глобальный хук, Windows переключит контекст в вашу программу и сделает обратный вызов. Его гораздо проще использовать, поскольку вам не нужен механизм IPC с внедренной DLL, который требуется для глобальной ловушки. Перехватчик низкого уровня остается активным до тех пор, пока вы не отсоединитесь, поток, которому принадлежит очередь сообщений, не прекратит работу или не завершит ваш процесс, в зависимости от того, что произойдет раньше.

2 голосов
/ 16 августа 2010

На моем веб-сайте есть скелетная клавиатура с загружаемым кодом здесь (обратите внимание на кнопку «скачать» внизу страницы).В этой статье обсуждаются некоторые вещи, которые вам необходимо понять, такие как общие разделы, и сообщается о превосходной статье Кайла Марша о перехватах Win32 (если какой-то идиот в MSDN до сих пор не снял ее из-за недостаточной .netty).

Исходный код приведен в примере, для него просто требуется сборка make-файла / sln (я не знаю, какой компилятор / версию вы будете использовать).Код, пугающе похожий на тот, который был в коммерческом продукте уже десять лет, поэтому я знаю, работает.

Обратите внимание, что проблемы с уровнем целостности могут снизить полезность перехвата в Vista и W7.

1 голос
/ 16 августа 2010

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

Но поскольку ваша программа отличается от той, которую вы выполняетеперехватывая, ваш цикл сообщений не вызовет зависания других процессов.Это называется многозадачность:)

...