c++ - 为什么系统托盘图标会清除之前显示的图标?

标签 c++ windows system-tray

我们有一个应用程序使用各种系统托盘图标与用户交流。不同的图标表示(否则无窗口)应用程序的不同内部状态。我们使用 this Code Guru project 中的代码实现了我们的系统托盘内容(MFC 版本;这无论如何都不是新的应用程序),直到最近,它运行良好。但是,最近我们尝试添加另一个图标,但遇到了麻烦。

这是应该的工作方式:

  1. 我们有一个主图标(称之为“A”),表示应用程序正在运行。

  2. 如果发生特定事件,我们会显示图标“B”,用户可以将鼠标悬停在该图标上以获得包含该事件状态的工具提示。

  3. 如果(最近添加的、内部的、线程化的)过程开始,我们会显示图标“C”,并且用户可以再次将鼠标悬停在该图标上以查看指示该事件进度的工具提示。

实际上 发生了什么:如果当我们(尝试)显示图标“C”时图标“B”可见,那么图标“B”要么完全消失,永远不会返回,要么留在那里图标“C”永远不会出现,但图标“B”的工具提示已更改为图标“C”应有的内容。

我稍微简化了场景;我们实际上还有一些其他图标,但很少使用。但是,在过去几周添加图标“C”之前,我们在显示多个图标时从未遇到过任何问题。

有什么想法吗?很高兴澄清任何我没有解释清楚的事情。

最佳答案

您需要为每个图标使用不同的 uIDdocumentation说:

The application-defined identifier of the taskbar icon. The Shell uses either (hWnd plus uID) or guidItem to identify which icon to operate on when Shell_NotifyIcon is invoked. You can have multiple icons associated with a single hWnd by assigning each a different uID. If guidItem is specified, uID is ignored.

换句话说,您需要为 uID 选择一个值。这就是每次调用 Shell_NotifyIcon() 时 shell 知道您指的是哪个图标的方式。显然,您必须为每个图标使用不同的值。因此,0 用于图标 A1 用于图标 B 等。

关于c++ - 为什么系统托盘图标会清除之前显示的图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7920116/

相关文章:

c++ - 你能防止 istream 或 stringstream 吞掉换行符吗?

C++模板传入一个模板类,后面指定模板类型

python - Windows XP GTK 应用程序 Glib 导入错误

c++ - 如何判断当前窗口是否为事件窗口?

c++ - 如何在 C++ 程序中创建 KDE 托盘通知?

c++ - 光线追踪 GLSL - 位置移动时球体拉伸(stretch)

c++ - 如何用微秒创建时间戳

windows - makefile - 转义括号

c# - 自定义系统托盘 Windows Phone 8?

C#如何判断hwnd是否在托盘图标中