インターフェイスを実装IContextMenu3
し、独自のカスタム アクセラレータのキーストロークをキャプチャしようとしています。問題は、ルート メニューのサブメニューにカーソルを合わせるとWM_MENUCHAR
メッセージが表示されないのに対し、サブメニューの 1 つにあるサブメニューにカーソルを合わせるとメッセージが表示されることです。
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 );
}