【问题标题】:Get HMENU from HWND within a Hook在 Hook 中从 HWND 获取 HMENU
【发布时间】: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


【解决方案1】:

您可以发送MN_GETHMENU消息获取HMENU:

case WM_CREATE:
{
     WCHAR szClass[128];
    GetClassName(cwps->hwnd, szClass, 127);
    if (wcscmp(szClass, L"#32768") == 0)
    {
        // Must delay MN_GETHMENU...
        PostMessage(g_hDlg,WM_APP,(WPARAM)cwps->hwnd,(LPARAM)HookCallWndProc);
    }
    break;
}

...

LRESULT CALLBACK MyWindow(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
    switch(msg)
    {
    case WM_APP:
        if (lp == (LPARAM)HookCallWndProc) // Just making sure it is our special message 
        {
            HMENU hMenu = (HMENU) SendMessage((HWND)wp,MN_GETHMENU,0,0);
            if (hMenu)
            {
                AppendMenu(hMenu,MF_STRING,666,L"Hello SO");
            }
        }
        break;

这有点骇人听闻,但在自定义这样的控件时,骇客几乎是不可避免的......

【讨论】:

  • 谢谢安德斯,这就行了。我认为可能需要进行某种破解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2011-06-13
  • 2016-04-28
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多