嘿嘿。最后,经过大量的摆弄,我得到了一个 .rc 加载的上下文菜单,让我的托盘通知图标正常工作。(基于对话框的 Windows API 应用程序,没有 MFC)。但是,在各种示例和使用演示中,我总是看到HMENU
在调用. 通知图标的弹出菜单在 MSDN 上根本没有记录(至少我没有找到超过一个段落)。CreateMenu()
LoadMenu()
DestroyMenu()
TrackPopupMenu()
直观地说,我将 放在LoadMenu()
消息处理中WM_INITDIALOG
并存储HMENU
,因此我不必每次都创建和销毁菜单。正如我所说,我还没有找到任何类似的例子,我觉得这有点有趣。在使用菜单或应用程序时,我是否有可能HMENU
被“损坏”?或者像我一样追求(好吧,边缘的)额外性能是否安全?
INT_PTR CALLBACK MainDlg(HWND ..., UINT, WPARAM, LPARAM)
{
switch (message)
{
case WM_INITDIALOG:
...
HMENU hMenuBar = LoadMenu(hInst, MAKEINTRESOURCE(IDR_NOTIFYMENU));
hNotifyMenu = GetSubMenu(hMenuBar, 0);
...
break;
...
case WM_NOTIFYICON:
switch (lParam)
{
case WM_RBUTTONUP: // there is no WM_CONTEXTMENU for
{ // nid.uVersion != NOTIFYICON_VERSION_4
POINT CursorPos;
GetCursorPos(&CursorPos);
// this is where I saw LoadMenu and stuff in examples
SetForegroundWindow(hDlg); // otherwise menu won't disappear
TrackPopupMenu(hNotifyMenu, TPM_LEFTALIGN, CursorPos.x,
CursorPos.y, 0, hDlg, NULL);
PostMessage(hDlg, WM_NULL, 0, 0); // otherwise menu locks hDlg
// this is where I saw DestroyMenu in examples
}
return (INT_PTR)TRUE;
}
...
}
...
}