2015-01-13 2 views
1

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

Вот мой код:

#include <windows.h> 

HHOOK g_hMouse; 

LRESULT CALLBACK MouseHook(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    printf("MOUSE EVENT!\n"); 

    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

int main() 
{ 
    g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseHook, NULL, NULL); 

    while (1) { 
     Sleep(2); 
    } 

    return 0; 
} 

Любая помощь будет оценена.

Спасибо.

+0

Помогло ли вам работать с помощью BrendanMcK. – Pat

ответ

3

WM_MOUSE_LL крючки требуют, чтобы установленная нить продолжала накачивать сообщения; поэтому здесь вам понадобится цикл GetMessage/DispatchMessage. Подробности для этого приведены в документах MSDN для WM_MOUSE_LL:

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

Если вы просто хотите попробовать что-то быстро, когда экспериментировал/отладки, заменить Sleep() с вызовом MessageBox(...), который будет блокировать ваш код, так что вы можете сделать тестирование, но он запускает свой собственный цикл обработки сообщений, так крюк будет работать.

+0

Ох, имеет смысл. Благодаря! – Pat

+2

Более безопасным вариантом было бы прекратить использование 'SetWindowsHookEx()' и вместо этого использовать 'RegisterRawInputDevices()'. Затем ваше приложение получит текстовые сообщения 'WM_INPUT', не затрагивая другие потоки/процессы. –

Смежные вопросы