Почему SetWindowsHookEx должен использоваться с очередью сообщений Windows - PullRequest
15 голосов
/ 18 сентября 2011

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

hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
        TranslateMessage(&msg);
        DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);

Почему что-то вроде этого не работает?

hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);

Использование форсированных потоков, и барьер тоже не работает. Почему ожидание между крючком и отцепом не может быть сделано по-другому?

EDIT:

Я сделал ошибку, когда создал этот образец, я создал хук WH_KEYBOARD_LL, а не WH_KEYBOARD, (я не думаю, что это имеет большое значение)

Также цикл никогда не выполняется, только ожидает функцию GetMessage.

Цикл выполняется только тогда, когда я отправляю сообщение о выходе PostThreadMessage(id, WM_QUIT, 2323, NULL);, поэтому я не понимаю, что он делает, кроме ожидания, есть ли какая-то внутренняя обработка?

Связанный:

C ++ SetWindowsHookEx WH_KEYBOARD_LL Правильная настройка

Как я могу установить хук CBT в окне консоли Win32?

Ответы [ 2 ]

33 голосов
/ 18 сентября 2011

Низкоуровневые хуки WH_KEYBOARD_LL и WH_MOUSE_LL отличаются от всех других хуков. Они не требуют, чтобы DLL была внедрена в целевой процесс. Вместо этого Windows вызывает ваш обратный вызов напрямую, внутри вашего собственного процесса. Чтобы это работало, необходим цикл сообщений. У Windows нет другого механизма для выполнения обратных вызовов в вашем основном потоке, обратный вызов может происходить только тогда, когда вы вызвали Get / PeekMessage (), так что Windows находится под контролем.

Глобальный хук типа WH_KEYBOARD сильно отличается. Это требует DLL, и обратный вызов происходит в процессе, который обрабатывает сообщение клавиатуры. Вам нужно какое-то межпроцессное взаимодействие, чтобы ваша собственная программа знала об этом. Именованные трубы - обычный выбор. Что в противном случае, конечно, требует, чтобы этот внедренный процесс качал цикл сообщений. В противном случае он не получит сообщения клавиатуры.

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

Понимание низкоуровневой мыши и клавиатуры (win32)

4 голосов
/ 18 сентября 2011

Windows Hooks перехватывает цикл сообщений Windows: http://msdn.microsoft.com/en-us/library/ms644959#wh_keyboardhook

Хук WH_KEYBOARD позволяет приложению отслеживать трафик сообщений для сообщений WM_KEYDOWN и WM_KEYUP, которые должны быть возвращены функциями GetMessage или PeekMessage.Вы можете использовать хук WH_KEYBOARD для мониторинга ввода с клавиатуры, отправляемого в очередь сообщений.

Консольные приложения сами не перекачивают сообщения, а консольный процесс.Таким образом, он не будет работать, если у процесса нет цикла обработки сообщений.

См .:

Как настроить перехват CBT в окне консоли Win32?

C ++ SetWindowsHookEx WH_KEYBOARD_LL Правильная настройка

...