系统托盘上下文菜单不会消失

Mar*_*rin 2 c++ windows winapi

我创建了一个通知图标:

notifyIcon.cbSize = sizeof(NOTIFYICONDATA);
notifyIcon.hWnd   = mainWnd;
notifyIcon.uID    = 100;
notifyIcon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
notifyIcon.hIcon  = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LOGO));
notifyIcon.dwState = NIS_SHAREDICON;
notifyIcon.uVersion = NOTIFYICON_VERSION;
notifyIcon.uTimeout = 15000;
notifyIcon.uCallbackMessage = APP_MSG_TRAY;
wcscpy_s(notifyIcon.szTip, 127, WTXT_APP_TRAY_TOOLTIP);

Shell_NotifyIcon(NIM_ADD, &notifyIcon);
Shell_NotifyIcon(NIM_SETVERSION, &notifyIcon);
Run Code Online (Sandbox Code Playgroud)

并在WM_RBUTTONDOWN和WM_CONTEXTMENU上弹出一个上下文菜单,如下所示:

MENUITEMINFO separatorBtn = {0};
separatorBtn.cbSize = sizeof(MENUITEMINFO);
separatorBtn.fMask = MIIM_FTYPE;
separatorBtn.fType = MFT_SEPARATOR;

HMENU hMenu = CreatePopupMenu();

if(hMenu) {
 InsertMenu(hMenu, -1, MF_BYPOSITION, APP_OPEN_OPTIONS, WTXT_OPTIONS);
 InsertMenuItem(hMenu, -1, FALSE, &separatorBtn);
 InsertMenu(hMenu, -1, MF_BYPOSITION, APP_MSG_EXIT, WTXT_EXIT);

 POINT pt;
 GetCursorPos(&pt);
 SetForegroundWindow(mainWnd);
 TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, mainWnd, NULL);
 PostMessage(mainWnd, WM_NULL, 0, 0);
 DestroyMenu(hMenu);
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但上下文菜单并不总是消失.有时(经常)如果你有ie.系统托盘中的winamp和我的应用程序图标,如果你右键单击我的应用程序和winamp后,将出现机器人菜单,我的菜单不会自动消失,直到你点击一个项目.

有任何想法吗?

谢谢...

Jac*_*ack 8

要显示通知图标的上下文菜单,当前窗口必须是应用程序调用TrackPopupMenu或TrackPopupMenuEx之前的前台窗口.否则,当用户单击菜单外部或创建菜单的窗口(如果可见)时,菜单不会消失.

SetForegroundWindow(hDlg);

TrackPopupMenu(   hSubMenu,
                 TPM_RIGHTBUTTON,
                 pt.x,
                 pt.y,
                 0,
                 hDlg,
                 NULL);
Run Code Online (Sandbox Code Playgroud)

  • 我不在乎时间,只是为了解决这个问题,哈哈 (2认同)

Ste*_*fan 5

不要捕获 WM_RBUTTONDOWN,而是捕获 WM_RBUTTONUP。当然,不要同时处理 WM_RBUTTONUP 和 WM_CONTEXTMENU,因为它们都会处理,并且每次右键单击都会显示上下文菜单两次。显示菜单两次会产生您所描述的效果:菜单显示,但似乎不会消失(因为它第二次立即再次显示)。