我实现了一个IContextMenu3
接口,我正在尝试捕获我自己的自定义加速器的击键。问题是,如果我将鼠标悬停在根菜单中的子菜单上,我不会收到任何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 :(得分:4)
WM_MENUCHAR
仅针对子菜单转发。 (它不能转发给顶级菜单项,因为那将是一个Catch-22。你想把它转发到键对应的菜单项的上下文菜单处理程序,但你不能这样做直到你得到WM_MENUCHAR
的答案!)
答案 1 :(得分:2)
这个怎么样: 如果您正在处理IContextMenu3消息,因此WM_DRAWITEM,您可以使用WindowFromDC()从WM_DRAWITEM获取菜单窗口的HWND,然后将其子类化并捕获WM_KEYDOWN或用它做任何您喜欢的事情。 我试过了(正在做一些其他的事情)并且它有效。
答案 2 :(得分:0)
问题是子菜单中的第一项。如果子菜单中的第一项也是子菜单,则消息不会通过。所以我在那里放了一个正常的项目。