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