Фильтрация сообщений Windows с помощью функции Hook Filter

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

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 создается снова и снова, поскольку он получает множество сообщений.


person JohnG    schedule 18.05.2009    source источник


Ответы (2)


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

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

person arul    schedule 18.05.2009
comment
Думаю, вы правы, я, должно быть, зацепил не то окно. Проверю свою логику. Спасибо, что посмотрели мой код. - person JohnG; 19.05.2009

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);
}
person Canopus    schedule 18.05.2009
comment
Ваш комментарий тоже помог. Я действительно получил необходимую мне функциональность с помощью хука WH_CALLWNDPROC, который, как вы упомянули, использует CWPSTRUCT. Я также подключал не то окно. :) Спасибо за помощь! - person JohnG; 25.05.2009