2012-05-02 29 views
3

私はIContextMenu3インターフェイスを実装しています。自分のカスタムアクセラレータのキーストロークをキャプチャしようとしています。問題は、ルートメニューのサブメニューにカーソルを合わせると、WM_MENUCHARメッセージが表示されないのに対して、私のサブメニューの1つの内側にあるサブメニューにカーソルを置くと、表示されません。WM_MENUCHARメッセージが表示されないのはなぜですか?

子供がいる場合はWM_INITMENUPOPUPメッセージのみが送信されることがわかりました。 WM_MENUCHARには、アクセラレータがキーにバインドされていないという警告があります。私はキーを押すと、特有の「アクセラレータなし」のビープ音を鳴らすので、この警告を保持する必要があります。

気付いていない別の警告がありますか?


HRESULT CFolderViewImplContextMenu::QueryContextMenu(HMENU hmenu, UINT uMenuIndex, UINT idCmdFirst, UINT idCmdLast, UINT /* uFlags */) 
{ 
UINT uID = idCmdFirst; 
HMENU hSubmenu = CreatePopupMenu(); 

MENUITEMINFO mii = { 0 }; 
mii.cbSize = sizeof(MENUITEMINFO); 
mii.fMask = MIIM_SUBMENU | MIIM_ID | MIIM_STRING; 
mii.dwTypeData = str_toWchar("test"); 
mii.wID = uID++; 
mii.hSubMenu = hSubmenu;  

InsertMenuItem (hmenu, 0, TRUE, &mii); 
InsertMenu (hSubmenu, 0, MF_BYPOSITION, uID++, L"&Notepad"); 
InsertMenu (hSubmenu, 1, MF_BYPOSITION , uID++, L"&Internet Explorer"); 

HMENU hSubmenu2 = CreatePopupMenu(); 
MENUITEMINFO mii2 = {0}; 
mii2.cbSize = sizeof(MENUITEMINFO); 

mii2.fMask = MIIM_ID | MIIM_TYPE | MIIM_SUBMENU; 
mii2.fType = MFT_OWNERDRAW; 
mii2.wID = uID++; 
mii2.hSubMenu = hSubmenu2; 
InsertMenuItem (hSubmenu, 0, TRUE, &mii2); 

InsertMenuA (hSubmenu2, 0, MF_BYPOSITION, uID++, ""); 

return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, uID - idCmdFirst); 
} 

答えて

0

問題はサブメニューの最初の項目です。サブメニューの最初の項目がサブメニューでもある場合、メッセージは渡されません。だから私は代わりにそこに普通のアイテムを置く。

+0

これは意味があります。なぜなら、 'GetMenuItemID'はサブメニューで失敗するからです。したがって、どのコンテキストメニュー拡張が 'WM_MENUCHAR'コマンドを取得するかを推測しようとする試みは失敗します。私はあなたがサブメニューを最後の2番目にポジション0に忍び込ませるのを逃しました。 –

4

WM_MENUCHARだけサブメニューのために転送されます。

これは、私はそれが問題を再現し得ることができる最小のコードです。 (これはCatch-22なのでトップレベルのメニュー項目のために転送することはできません。そのキーが対応するメニュー項目のコンテキストメニューハンドラに転送しますが、それはできませんWM_MENUCHARへの回答があるまで)

+0

私はあなたが誤解していると思います。私は、マウスが上に乗っているサブメニューの文脈にメッセージを転送したい。または、トップレベルのサブメニューが非トップレベルのサブメニューと異なると言っていますか? – chacham15

+0

サブメニューが開いている場合、シェルはそのサブメニューのすべてのIDが自分の内線番号に属しているため、どのシェル拡張がメッセージを送信するかを知ることができます。しかし、サブメニューが開いていない場合、どのシェル拡張がメッセージを受け取るべきかは分かりません。 –

+0

はい、それは意味があります。しかし、私が説明している(サブメニューが、私の内線に属するすべてのIDで開かれている)私の拡張はまだメッセージを受け取ることができません! – chacham15

2

これはどう: あなたはIContextMenu3メッセージを処理している場合は、結果的にWM_DRAWITEMは、あなたが、WM_DRAWITEMからメニューウィンドウのHWNDを取得し、それをサブクラス化し、WM_KEYDOWNをキャッチしたり、あなたがそれを好きなようするWindowFromDC()を使用することができます。 私はそれを試しました(これ以外のものをやっていました)。

関連する問題