WndProc挂钩不从菜单接收WM_COMMAND

pet*_*hen 2 c++ winapi

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

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

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

安装挂钩:

currentHook = SetWindowsHookEx(WH_CALLWNDPROC, 
                               HookProc, 0, GetCurrentThreadId());
Run Code Online (Sandbox Code Playgroud)

HookProc,简约:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

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

Sho*_*og9 6

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

您应该能够使用WH_GETMESSAGE钩子来拦截发布的消息.如果你想要处理两种形式,你将需要两者WM_COMMAND.