2010-04-16 68 views

回答

34

服务运行在与登录用户不同的窗口站中,因此您无法为它们设置系统托盘图标。从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

9

您不能直接访问,因为Windows服务必须在机器启动时启动,而不是在用户登录时启动。该服务也将在不同的环境中运行,可能与其他用户不同。

可以做的是写一个单独的系统托盘基于“控制器”,与服务交互。