如何为C#窗口服务显示系统托盘图标?

47

我该如何为C#窗口服务显示系统托盘图标?

2个回答

43

服务运行在与登录用户不同的窗口站点中,因此您无法为它们创建系统托盘图标。引用自https://learn.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应用程序可能更合适。

以下是有关如何编写系统托盘的几个链接。由于服务无法直接在系统托盘中具有图标,因此您需要另一个应用程序来与服务进行交互。

如何制作一个只在系统托盘中运行的.NET Windows窗体应用程序?

以及

http://msdotnetsupport.blogspot.com/2008/02/cnet-application-windows-system-tray.html


16

直接来说,你不能这样做,因为Windows服务必须在机器启动时才会开始工作,而不是用户登录时。此外,该服务将在不同的上下文中运行,可能是不同的用户。

但是,你可以编写一个单独的基于系统托盘的“控制器”来与该服务进行交互。


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