Подозреваю, что потому, что обработчик и основная программа находятся в одном потоке. И когда должен сработать хук - система определяет, что поток спящий, и не передает ему управление.
beginner Честно говоря была такая мысль, значит если в основной программе будет какой-нибудь бесконечный цикл то должно заработать? Странно, но MessageBox вроде также как wait-функция приостанавливает программу, а с ним все работает. Написал значит так: вместо WaitForSingleObject(sem,INFINITE) поставил: flag объявил глобально как "char flag=0;" А в обработчике, вместо ReleaseSemaphore(sem,1,NULL); поставил flag=1; Результат тот же самый, не работает.
Вообщем попробывал создать вторым потоком код, который отдельно запускает семафор - нефига чтото не получилось. И странно, что не работает такая конструкция: глобальная переменная: int x = 1; в теле программы: while (x) { Sleep(100); } UnhookWindowsHookEx(hHook); в обработчике: if (p->vkCode==VK_LWIN) { x = 0; ... UPDATE :-D мысли сходятся
Вообщем вот так заработало: Код (Text): Глобальная переменная: DWORD hThread; Тело программы: hThread = GetCurrentThreadId(); MSG mess; while (GetMessage(&mess, NULL,0,0)) { if (mess.message==WM_USER+1) break; } UnhookWindowsHookEx(hHook); Обработчик: if (p->vkCode==VK_LWIN) { PostThreadMessageA(hThread, WM_USER+1, 0, 0); ......... }