为了跟踪用户活动,我使用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。
答案 0 :(得分:6)
菜单命令已发布,未发送(是的,文档对此不太清楚 - 但Spy ++说实话)。并且WH_CALLWNDPROC
挂钩仅捕获已发送的消息。
您应该能够使用WH_GETMESSAGE
挂钩来拦截已发布的消息。如果您想处理WM_COMMAND
这两种形式,则需要。
答案 1 :(得分:0)
您是否尝试跟踪WM_MENUCOMMAND?