2010-04-16 69 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服務必須在機器啓動時啓動,而不是在用戶登錄時啓動。該服務也將在不同的環境中運行,可能與其他用戶不同。

可以做的是寫一個單獨的系統托盤基於「控制器」,與服務交互。