【发布时间】:2010-04-16 10:44:16
【问题描述】:
如何为 C# 窗口服务显示系统托盘图标?
【问题讨论】:
如何为 C# 窗口服务显示系统托盘图标?
【问题讨论】:
服务在与登录用户不同的窗口站中运行,因此您不能为它们设置系统托盘图标。来自https://docs.microsoft.com/en-us/dotnet/framework/windows-services/introduction-to-windows-service-applications:
Windows 服务应用程序在与登录用户的交互站不同的窗口站中运行。窗口站是包含剪贴板、一组全局原子和一组桌面对象的安全对象。因为 Windows 服务的站不是交互式站,所以从 Windows 服务应用程序中出现的对话框将不会被看到,并且可能会导致您的程序停止响应。同样,错误消息应该记录在 Windows 事件日志中,而不是在用户界面中引发。
.NET Framework 支持的 Windows 服务类不支持与交互站(即登录用户)进行交互。 .NET Framework 也不包括代表工作站和桌面的类。如果您的 Windows 服务必须与其他站交互,您将需要访问非托管 Windows API。有关详细信息,请参阅 Windows SDK 文档。
必须仔细设计 Windows 服务与用户或其他站点的交互,以包括没有登录用户或用户拥有一组意外的桌面对象等场景。在某些情况下,编写一个在用户控制下运行的 Windows 应用程序可能更合适。
这里有几个关于如何写入系统托盘的链接。您需要另一个应用程序来与该服务交互,因为该服务不能直接在系统托盘中有一个图标。
How can I make a .NET Windows Forms application that only runs in the System Tray?
和
http://msdotnetsupport.blogspot.com/2008/02/cnet-application-windows-system-tray.html
【讨论】:
您不能,不能直接启动,因为 Windows 服务必然会在机器启动时启动,而不是在用户登录时启动。该服务还将在不同的上下文中运行,可能以不同的用户身份运行。
您可以做的是编写一个单独的基于系统托盘的与服务交互的“控制器”。
【讨论】: