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, ¬ifyIcon);
Shell_NotifyIcon(NIM_SETVERSION, ¬ifyIcon);
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后,将出现机器人菜单,我的菜单不会自动消失,直到你点击一个项目.
有任何想法吗?
谢谢...
要显示通知图标的上下文菜单,当前窗口必须是应用程序调用TrackPopupMenu或TrackPopupMenuEx之前的前台窗口.否则,当用户单击菜单外部或创建菜单的窗口(如果可见)时,菜单不会消失.
SetForegroundWindow(hDlg);
TrackPopupMenu( hSubMenu,
TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
hDlg,
NULL);
Run Code Online (Sandbox Code Playgroud)
不要捕获 WM_RBUTTONDOWN,而是捕获 WM_RBUTTONUP。当然,不要同时处理 WM_RBUTTONUP 和 WM_CONTEXTMENU,因为它们都会被处理,并且每次右键单击都会显示上下文菜单两次。显示菜单两次会产生您所描述的效果:菜单显示,但似乎不会消失(因为它第二次立即再次显示)。
| 归档时间: |
|
| 查看次数: |
4325 次 |
| 最近记录: |