Собственно, сабж. Основной поток создает поток для обработки сообщений от хука, ставит хук и самозавершается. Новому потоку никаких сообщений не приходит. Если стартовый поток засуспендить, то все работает. Хук принадлежит потоку, не процессу? Код (Text): CreateThread (NULL, 0, //поток,обрабатывающий сообщения от процедуры-перехватчика ThreadProc, 0, 0, &idThread); hhook = SetWindowsHookEx (WH_GETMESSAGE, HookProc, g_hInstance, 0); Sleep (INFINITE); //если убрать, то хук не вызывается ExitThread (0);
При завершении процесса,породившего некоторый хэндл(HHOOK - тоже хэндл), WINDOWS закрывает все хэндлы, открытые процессом. add: Скорее процесса или потока. В любом случае, это происходит при завершение родителя.
Это кажется нелогичным, но похоже, что именно потоку. Win2k3 x86 sp2: после вызова NtTerminateThread (к которому и сводится ExitThread) хук убирается, а загруженная во все процессы dll, содержащяя HookProc, выгружается. По крайней мере это так для хуков WH_GETMESSAGE.