2012-01-08 50 views
3

我正在我的应用程序中安装一个钩子以获得标准的EDIT上下文菜单(撤销/复制/编辑/粘贴/等)。我需要为我的应用程序插入一个新的菜单项。从HWND中获取HMENU Hook

我设置了一个窗口钩子,但我似乎无法获取上下文菜单的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?

感谢, 凯文

+0

GetMenu仅适用于“menubars”AFAIK – Anders 2012-01-09 02:34:58

回答

2

您可以将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; 

这是一个有点哈克但定制这样的控制,当黑客是几乎不可避免...

+0

感谢安德斯,这将做的伎俩。我认为某种破解可能是必要的。 – jubican 2012-01-09 05:57:04