2010-04-16 3 views

ответ

34

Услуги выполняются на другой оконной станции, чем вошедший в систему пользователь, поэтому у вас не может быть значок в системном трее. От https://docs.microsoft.com/en-us/dotnet/framework/windows-services/introduction-to-windows-service-applications:

Приложения Windows Service работают на другой оконной станции, чем интерактивная станция зарегистрированного пользователя. Окна станции - это защищенный объект, содержащий буфер обмена, набор глобальных атомов и группу объектов рабочего стола. Поскольку станция службы Windows не является интерактивной станцией, диалоговые окна, созданные из приложения-службы Windows, не будут видны и могут заставить вашу программу перестать отвечать на запросы. Аналогично, сообщения об ошибках должны регистрироваться в журнале событий Windows, а не возникать в пользовательском интерфейсе.

Классы обслуживания Windows, поддерживаемые платформой .NET Framework, не поддерживают взаимодействие с интерактивными станциями, то есть вошедшим в систему пользователем. .NET Framework также не включает классы, которые представляют собой станции и настольные компьютеры. Если ваша служба Windows должна взаимодействовать с другими станциями, вам необходимо получить доступ к неуправляемому API Windows. Дополнительные сведения см. В документации 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 обязательно начнется, когда машина будет работать, а не когда пользователь войдет в систему. Служба также будет работать в другом контексте, скорее всего, как другой пользователь.

Что вы можете сделать: «can do - написать отдельный« контроллер »на базе системного лотка, который взаимодействует с сервисом.

Смежные вопросы