How to always show program tray icons in Windows by *default*?

元气小坏坏 提交于 2019-12-30 04:21:21

问题


If a program is executed for the first time in Windows 7, it automatically hides the icon. Is there any manifest setting or option to force Windows 7 to always show the icon by default?


回答1:


In .NET Rocks podcast, not long time ago, Kate Gregory from Microsoft was saying that it is impossible.

She said something like: "If user wants it (tray icon) he/she will put it there". Reason for this is to prevent mess in the tray area.




回答2:


If you really want to show your tray-icon, you can popup a balloon with minimal text and just afterwards hide the balloon and it's shadow again by following code-example:

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

if you repeat this (e.g. every 30 seconds), your trayicon will stay there because Explorer.exe thinks, there is a balloon open to display to the user. A few minor issues - such as no right-click directly on icon - are still there.

I really used to show the tray icon for our company-software where the user are not intended to do this manually and for each update. So maybe this will help someone... :)

Otherwise, I totally agree: This should be only in hands of the user, not controlled by the application.




回答3:


It's certainly not "impossible". There is an undocumented COM interface ITrayNotify for retrieving tray icons and changing their visibility, used by Explorer itself. Full C++ source here: http://thread0.me/tag/windows/

Of course, using an unofficial API is risky and Windows 8 has intoduced breaking changes to this API, which means you have to use 2 different definitions for XP - Win7 and Win8 - Win10. But hey, even Chrome uses this trick. Just be sure to handle failures properly.




回答4:


A question marked as duplicate has the answer of how it is done.

Here's a link (alternate link) that explains how and here's C# code.



来源:https://stackoverflow.com/questions/904790/how-to-always-show-program-tray-icons-in-windows-by-default

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!