【发布时间】:2013-05-21 15:23:16
【问题描述】:
我正在开发一个 C++ 应用程序,该应用程序在通知区域中创建一个带有气球提示的图标。当用户单击气球时,将使用 Shell_NotifyIcon(NIM_DELETE, &nid) 删除图标,正如 MSDN 指示的那样。
问题是通知图标离开了托盘,但它仍保留在“通知区域图标”窗口中(当您单击 Windows 7/8 托盘中的“自定义”选项时打开的窗口)。然后,如果用户重新启动程序,图标将重复多次,因为程序可以重新启动,即使计算机正在重新启动。
我搜索了一下,发现删除了一些注册表项,可以清理缓存,但是需要重新启动 explorer.exe ......但这不是我想要实践的选项,原因有很多。
我的问题是: - 你们有人见过这个吗? - 是否有其他 Shell_NotifyIcon 的替代方法(假设使用这个是问题的可能性,一旦我对 Winapi 没有太多经验); - 有什么方法可以在不重启 explorer.exe 的情况下在通知区域窗口中强制“缓存清理”?
对于那些可以提供帮助的人,我提前表示感谢。
【问题讨论】:
-
听起来 NIM_DELETE 实际上并没有工作。检查你的结构是否正确初始化,因为它是一个相当混乱的 API。
-
它正在从托盘中删除,但图标仍然在自定义窗口中。
-
它应该保留在自定义对话框中。这样,用户就知道图标首先出现了,并且可以在图标再次出现时决定图标的行为。只是在自定义对话框中列出不应该阻止您的应用程序再次运行,或再次显示相同的图标。如果它不能正常工作,或者重复显示,那么你一定是在你的托盘图标管理代码中做了一些根本性的错误。
-
至于替代方案,有
IUserNotification和IUserNotification2接口,但它们只是在内部使用Shell_NotifyIcon()的包装器。 -
我会尝试 IUserNotification2 intead。谢谢雷米!