2009-05-18 4 views
1

Я пытаюсь получить сообщения для другого приложения с помощью крючка Windows. Я установил крюк WH_GETMESSAGE с помощью SetWindowsHookEx. Это делается через DLL. В моей функции GetMsgProc (которая должна вызываться всякий раз, когда целевое приложение получает сообщение), я хочу принять действие на основе типа сообщения. Однако у меня возникают проблемы с этим утверждением if.Фильтрация сообщений Windows в функции фильтра крюка

LRESULT CALLBACK MessageHookProcedure(int code, WPARAM wParam, LPARAM lParam){ 
    if(((MSG*)lParam)->message == WM_COMMAND){ 
     MessageBox(NULL,L"The hook procedure was called",L"Test Window",MB_OK); 
    } 

    return CallNextHookEx(g_MessageHook,code,wParam,lParam); 
} 

По какой-то причине MessageBox никогда не создается. Я знаю, что приложение получает сообщения WM_COMMAND от Spy ++. Если я вынимаю оператор IF, MessageBox создается снова и снова, поскольку он получает множество сообщений.

ответ

1

Вы уверены, что используете подходящее окно или соответствующее сообщение? При некоторых обстоятельствах вместо WM_COMMAND создается WM_SYSCOMMAND или WM_MENUCOMMAND.

Ваш код выглядит хорошо, вы также попытались сбросить входящие сообщения в консоль?

+0

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

0

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

LRESULT CALLBACK MessageHookProcedure(int code, WPARAM wParam, LPARAM lParam){ 
    if(((CWPSTRUCT*)lParam)->message == WM_COMMAND){ 
     MessageBox(NULL,L"The hook procedure was called",L"Test Window",MB_OK); 
    } 

    return CallNextHookEx(g_MessageHook,code,wParam,lParam); 
} 
+0

Ваш комментарий тоже помог. Я действительно получил функциональность, которая мне нужна, с крюком WH_CALLWNDPROC, который использует CWPSTRUCT, как вы упомянули. Я также зацепил неправильное окно. :) Спасибо за помощь! – JohnG

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