为了跟踪用户活动,我使用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.
菜单命令是发布的,而不是发送的(是的,文档对此不太清楚 - 但是Spy ++说实话).并且WH_CALLWNDPROC钩子只捕获已发送的消息.
您应该能够使用WH_GETMESSAGE钩子来拦截发布的消息.如果你想要处理两种形式,你将需要两者WM_COMMAND.