如何在Windows中默认始终显示程序托盘图标?

10
如果在Windows 7中首次运行程序,则会自动隐藏图标。是否有清单设置或选项可以强制Windows 7始终默认显示图标?
3个回答

14

在不久前的.NET Rocks播客中,来自Microsoft的Kate Gregory说过这样一句话:“这是不可能的。”

她的意思是:“如果用户想要托盘图标,他/她会把它放到那里。”这么做的原因是为了避免托盘区域混乱。


4
我认为这是一件很棒的事情。系统托盘经常被滥用,我一直试图将所有东西都设置为“始终隐藏”,以尝试挽回屏幕空间。 - Jamie Penney
2
Jamie,我同意你的观点,但请记住,有些应用程序需要托盘图标作为访问主程序的唯一途径。而且我可以确定的是,Win7会产生大量的支持负担,“图标在哪里?” - Mark Hero
1
实际上,这可能是可能的...如果用户可以配置要显示哪些托盘图标,则必须可以通过代码进行配置(可能通过更改某些注册表值)。 - Thomas Levesque
马克:我认为你应该重新考虑程序的设计,在这种情况下。托盘不能像那样使用。故事完毕。 - bcat
2
@Mark:最终这是用户的决定。你可以显示一个弹出气泡,指出图标去了哪里。此外,你可以通过简单的点击和拖动将托盘图标移动到自动显示,因此工作量很小。 - Mauricio
1
“由用户决定”的方法存在一个问题,即在企业环境中,有时应该允许组织来确定这些内容。此外,在发布 Citrix 应用程序的情况下,似乎没有办法配置图标始终显示为实际存在于桌面上但对最终用户不可访问的图标。最终,在个人环境中,由用户决定通常是有效的,但并非总是适用于企业。” - RMD

4

如果你真的想显示托盘图标,可以使用以下代码示例弹出一个最小化的文本气泡,然后立即隐藏气泡及其阴影:

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认为有一个气球要显示给用户。一些小问题仍然存在,例如无法直接右键单击图标。
我曾经使用过托盘图标来显示我们公司软件的信息,用户不需要手动进行更新。因此,也许这会对某些人有所帮助... :)
否则,我完全同意:这应该只由用户控制,而不是由应用程序控制。

2
“当然,并非‘不可能’。Windows资源管理器本身使用未记录的COM接口ITrayNotify来检索托盘图标并更改其可见性。完整的C++源代码在这里:http://thread0.me/tag/windows/。但是,使用非官方API存在风险,而且Windows 8对此API进行了破坏性更改,这意味着您必须为XP - Win7和Win8 - Win10使用2个不同的定义。但是,甚至Chrome也使用了这个技巧。只要确保适当处理失败即可。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接