【发布时间】:2012-01-08 20:59:36
【问题描述】:
我在我的应用程序中安装了一个钩子来获取标准的 EDIT 上下文菜单(使用 undo/copy/edit/paste/etc.)。我需要为我的应用程序插入一个新菜单项。
我设置了一个 windows 挂钩,但我似乎无法获得上下文菜单的 HMENU。这是我设置钩子的地方:
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, NULL, GetCurrentThreadId());
这是我的回调函数:
LRESULT CALLBACK HookCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
LPCWPSTRUCT cwps = (LPCWPSTRUCT)lParam;
switch(cwps->message)
{
case WM_CREATE:
{
WCHAR szClass[128];
GetClassName(cwps->hwnd, szClass, 127);
if (wcscmp(szClass, L"#32768") == 0)
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)cwps->lParam;
HMENU hMenu = GetMenu(cwps->hwnd);
// hMenu is 0x0
//MENUINFO info;
//ZeroMemory(&info, sizeof(MENUINFO));
//info.cbSize = sizeof(info);
//GetMenuInfo(hMenu, &info);
MessageBox(NULL, L"Test", L"Test", NULL);
}
break;
}
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
我还尝试使用 WH_CALLWNDPROCRET 设置挂钩,但是这个甚至没有捕获菜单的 WM_CREATE 消息。
有谁知道如何为这种特殊情况获取 HMENU?
谢谢, 凯文
【问题讨论】:
-
GetMenu 仅适用于“菜单栏”AFAIK
标签: winapi hwnd setwindowshookex