1

我正在尝试使用 Windows 挂钩检索另一个应用程序的消息。我已经用 SetWindowsHookEx 设置了一个 WH_GETMESSAGE 钩子。这是通过 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。我知道应用程序正在接收来自 Spy++ 的 WM_COMMAND 消息。如果我取出 IF 语句,MessageBox 会在接收各种消息时一遍又一遍地创建。

4

2 回答 2

1

你确定你分别钩住了正确的窗口或正确的消息吗?在某些情况下会生成WM_SYSCOMMANDorWM_MENUCOMMAND而不是WM_COMMAND.

您的代码看起来不错,您是否也尝试将传入消息转储到控制台?

于 2009-05-18T02:09:15.743 回答
0

这里的 LPARAM 是指向 CWPSTRUCT 的指针,而 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);
}
于 2009-05-18T08:22:14.180 回答