2012-01-08 35 views
3

標準のEDITコンテキストメニュー(取り消し/コピー/編集/貼り付けなど)を取得するには、アプリケーション内にフックをインストールしています。私は自分のアプリケーションのための新しいメニュー項目を挿入する必要があります。フック内でHWNDからHMENUを取得

ウィンドウフックを設定しましたが、コンテキストメニューの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

答えて

2

あなたがHMENU取得するMN_GETHMENUメッセージを送ることができます。これは少しハックですが、このようなコントロールをカスタマイズするときのハックはかなり避けられない

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

関連する問題