【发布时间】:2011-10-27 17:48:17
【问题描述】:
我们有一个应用程序,它使用各种系统托盘图标与用户交流。不同的图标表示(否则无窗口)应用程序的不同内部状态。我们使用来自this Code Guru project(MFC 版本;无论如何这不是一个新应用程序)的代码实现了我们的系统托盘内容,直到最近,它都运行良好。但是,最近我们尝试添加另一个图标并遇到了麻烦。
这是假定的工作方式:
我们有一个主图标(称为“A”),表示应用程序正在运行。
如果发生特定事件,我们会显示图标“B”,用户可以将鼠标悬停在该图标上以获取有关该事件的状态的工具提示。
如果(最近添加的、内部的、线程的)过程启动,我们会显示图标“C”,并且用户可以再次将鼠标悬停在该图标上以查看指示该活动进度的工具提示。
发生了什么实际:如果在我们(尝试)显示图标“C”时图标“B”可见,那么图标“B”要么完全消失,永远不会返回,要么一直停留在那里并且图标“C”从未出现,但图标“B”的工具提示已更改为图标“C”应具有的内容。
我稍微简化了场景;我们实际上还有一些其他图标,但它们很少使用。但是,在过去几周添加图标“C”之前,我们从来没有遇到过显示多个图标的问题。
有什么想法吗?很高兴澄清我没有解释清楚的任何事情。
【问题讨论】:
-
向我们展示您对 Shell_NotifyIcon 的调用。
-
好吧,好吧。但是
m_tnd中有什么?听起来您正在重用NOTIFYICONDATA结构,或者可能为所有图标传递相同的hWnd和UID。 -
显示:Shell_NotifyIcon(NIM_ADD, &m_tnd) 隐藏:Shell_NotifyIcon (NIM_DELETE, &m_tnd); (m_tnd,一个 NOTIFYICONDATA 结构,是 CSystemTray 类的成员(由发布我引用的 CodeGuru 项目的人编写)。它在类初始化时填充。
-
每个图标都有自己的 CSystemTray 类,因此它自己的 NOTIFYICONDATA 专用于它。
-
嗯,我们没有设置 uID。他们都是零。这大概就是问题所在!想把它放在答案中吗?我会测试一下。 uID 有什么特别之处,还是只是我们自己对图标的内部值?
标签: c++ windows system-tray