如果程序在 Windows 7 中首次执行,它会自动隐藏图标。是否有任何清单设置或选项强制 Windows 7 默认始终显示图标?
3 回答
不久前,在 .NET Rocks 播客中,来自微软的 Kate Gregory 说这是不可能的。
她说:“如果用户想要它(托盘图标),他/她会把它放在那里”。这样做的原因是为了防止托盘区域混乱。
如果您真的想显示您的托盘图标,您可以弹出一个带有最少文本的气球,然后通过以下代码示例再次隐藏气球和它的阴影:
trayIcon.ShowBalloonTip(30000, "", ".", ToolTipIcon.None)
Dim balloonHandle As IntPtr = GetBalloonHwnd(balloonText) ' mainly: FindWindow("tooltips_class32", Nothing)
If (balloonHandle <> IntPtr.Zero) Then
Dim sysShadowClassHwnd As IntPtr = FindWindow("SysShadow", Nothing)
' will hide balloon and leaving a small shadow artifact - just for this balloon
PostMessage(balloonHandle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero)
SetWindowPos(balloonHandle, IntPtr.Zero, 0, 0, 0, 0, SWP_HIDEWINDOW)
If (sysShadowClassHwnd <> IntPtr.Zero) Then
' this will remove the small shadow artifact
PostMessage(sysShadowClassHwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero)
End If
End If
如果您重复此操作(例如每 30 秒),您的托盘图标将停留在那里,因为 Explorer.exe 认为,有一个打开的气球向用户显示。一些小问题 - 例如没有直接右键单击图标 - 仍然存在。
我真的曾经为我们的公司软件显示托盘图标,用户不打算手动执行此操作以及每次更新。所以也许这会对某人有所帮助...... :)
否则,我完全同意:这应该只在用户手中,而不是由应用程序控制。
这当然不是“不可能的”。Explorer 本身使用了一个未记录的 COM 接口ITrayNotify
,用于检索托盘图标并更改其可见性。完整的 C++ 源代码:http: //thread0.me/tag/windows/
当然,使用非官方 API是有风险的,并且 Windows 8 对该 API 进行了重大更改,这意味着您必须对 XP 使用 2 个不同的定义 - Win7 和 Win8 - Win10。但是,嘿,即使是Chrome 也使用这个技巧。只要确保正确处理故障。