2012-01-08 52 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