невозможно установить хуки для всех потоков в процессе

Я подключаю клавиатуру в приложении. Требование состоит в том, чтобы подключить клавиатуру во всех потоках в процессе.

Я использовал API SetWindowsHookEx.

SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)::KeyboardHookProc, hInst, 0);

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

Есть ли способ подключить процесс, а не потоки в процессе.


person anand    schedule 24.11.2009    source источник


Ответы (3)


Этот мелкий шрифт в документах SDK для LowLevelKeyboardProc имеет решающее значение:

Эта ловушка вызывается в контексте потока, который ее установил. Вызов осуществляется путем отправки сообщения потоку, который установил хук. Следовательно, поток, установивший обработчик, должен иметь цикл обработки сообщений.

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

person Hans Passant    schedule 24.11.2009

Согласно MSDN, WH__KEYBOARD___LL применяется глобально, а не для конкретного приложения.

Если вы хотите установить ловушку для конкретных потоков процесса, используйте WH___KEYBOARD.

person Ashish    schedule 24.11.2009
comment
Дело не в глобальном или конкретном приложении. Проблема в том, что при завершении вызова потока перехват также прекращается. - person anand; 24.11.2009
comment
Вы правы, я внедрил dll хуков в MS Excel и установил хук, указав threadId главного окна приложения, которое завершается только при выходе из приложения и работает нормально. - person Ashish; 24.11.2009

Просто установите хук в основную функцию. Если вам это нужно только при запуске определенного потока, вы можете использовать флаг volatile.

person dwo    schedule 24.11.2009