Я установил глобальную функцию подключения мыши следующим образом:
mouseEventHook = ::SetWindowsHookEx( WH_MOUSE_LL, mouseEventHookFn, thisModule, 0 );
Функция хука выглядит следующим образом:
RESULT CALLBACK mouseEventHookFn( int code, WPARAM wParam, LPARAM lParam )
{
if ( code == HC_ACTION ) {
PMSLLHOOKSTRUCT mi = (PMSLLHOOKSTRUCT)lParam;
// .. do interesting stuff ..
}
return ::CallNextHookEx( mouseEventHook, code, wParam, lParam );
}
Теперь, моя проблема в том, что я не могу контролировать, сколько времени точно занимает часть «делай интересные вещи». В частности, это может занять больше времени, чем LowLevelHooksTimeout, определенный в реестре Windows. Это означает, что, по крайней мере в Windows XP, система больше не доставляет события мыши в мою функцию ловушки. Я бы хотел этого избежать, но в то же время мне нужно, чтобы часть «делай интересные вещи» произошла за до того, как целевой графический интерфейс получит событие.
Я пытался решить эту проблему, выполняя работу с «интересными вещами» в отдельном потоке, чтобы вышеприведенный mouseEventHookFn
мог отправить сообщение в рабочий поток, а затем немедленно выполнить return 1;
(что завершает функцию перехвата, но избегает передачи события в GUI). Идея заключалась в том, что рабочий поток после завершения выполняет сам вызов CallNextHookEx
.
Однако это вызывает сбой внутри CallNextHookEx
(на самом деле сбой происходит внутри внутренней функции с именем PhkNextValid
. Я предполагаю, что небезопасно вызывать CallNextHookEx
извне функции перехвата, это правда?
Если это так, знает ли кто-нибудь еще, как я могу запустить код (который должен взаимодействовать с потоком GUI приложения) до того, как GUI получит событие и , чтобы избежать того, что моя функция ловушки блокируется слишком долго?