WndProc挂钩不从菜单接收WM_COMMAND

时间:2009-07-07 10:30:58

标签: c++ winapi

为了跟踪用户活动,我使用Windows Hook作为主应用程序线程,并监视(以及其他)WM_COMMAND消息。

我按照预期从对话框按钮,工具栏按钮,加速器和弹出菜单中收到它们,但我没有从主菜单中收到它们。

奇怪的是,Spy ++确实显示了接收它们的主窗口。可能有什么不对?

安装钩子:

currentHook = SetWindowsHookEx(WH_CALLWNDPROC, 
                               HookProc, 0, GetCurrentThreadId());

HookProc,minimalistic:

LRESULT CALLBACK HookProc(int nCode, WPARAM wp, LPARAM lp)
{
   CWPSTRUCT cwp = *(CWPSTRUCT *)lp;
   if (cwp.message == WM_COMMAND)
   {
      ATLTRACE("[hook!] WM_COMMAND id=%d\n", LOWORD(cwp.wParam));
   }
   return CallNextHookEx(currentHook, nCode, wp, lp);
}

(实际代码更复杂,需要检查重入等,但我已经为此测试重新编写了代码)

有什么想法吗?

[编辑]我测试的主窗口是一个MFC应用程序,但是仪器代码不使用任何MFC。

2 个答案:

答案 0 :(得分:6)

菜单命令已发布,未发送(是的,文档对此不太清楚 - 但Spy ++说实话)。并且WH_CALLWNDPROC挂钩仅捕获已发送的消息。

您应该能够使用WH_GETMESSAGE挂钩来拦截已发布的消息。如果您想处理WM_COMMAND这两种形式,则需要

答案 1 :(得分:0)

您是否尝试跟踪WM_MENUCOMMAND?