Показать окно сообщения из службы Windows

Можете ли вы отобразить окно сообщения (или любую форму уведомления) из службы Windows? Не могу заставить его работать. Я использовал:

            global::System.Windows.Forms.MessageBox.Show("A fatal error occurred. " +
                ServiceName + " is now terminating.");

но это не сработало и просто выдало ошибку.


person Jonn    schedule 07.05.2010    source источник


Ответы (6)


Нет, вы не можете показать окно сообщения из службы. Если вы хотите сообщить об ошибках, стандартный способ сделать это — использовать журнал событий.

Для более «продвинутых» видов пользовательского интерфейса (не только отчетов об ошибках) это обычно делается с помощью обычного приложения Windows, которое вы помещаете в папку «Автозагрузка» пользователя (или ключ «Выполнить» в реестре) и общаетесь со службой. через какой-то механизм IPC (удаленное взаимодействие .NET, WCF, обычные сокеты, именованные каналы и т. д.).

person Dean Harding    schedule 07.05.2010
comment
Ох... Я надеялся на общий обработчик исключений, который уведомлял бы пользователя об ошибке в службе. В некоторых случаях это могло привести к сбою, и пользователи не знали, что служба потерпела крах. - person Jonn; 10.05.2010
comment
Я постоянно использую окна сообщений при отладке. Это быстрый и простой способ выяснить, какие проблемы могут возникнуть. НИКОГДА не используйте окно сообщения в релизе! Всегда используйте журнал событий при создании релиза! Чтобы использовать окно сообщения для целей отладки, просто добавьте ссылку System.Windows.Forms в свой проект. - person Arvo Bowen; 10.06.2014
comment
Я хочу сообщить пользователю, что я не могу вести журнал событий. Но единственный способ - зарегистрировать событие? Это неловко. - person user922020; 02.11.2017

Вы можете отобразить сообщение из службы с помощью "WTSSendMessage(...)" (которая доступна начиная с Windows Vista и Windows Server 2008), вот хорошая статья: http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx

person Mike    schedule 24.09.2011

Из Википедии:

Хотя обычно службы не имеют пользовательского интерфейса, разработчики могут добавлять формы и другие компоненты пользовательского интерфейса. В этом случае необходимо установить флажок «Разрешить взаимодействие службы с рабочим столом» на вкладке «Вход в систему» ​​в диалоговом окне «Свойства службы» (однако при таком подходе следует соблюдать осторожность, так как это может создать угрозу безопасности, поскольку любой вошедший в систему пользователь сможет взаимодействовать с сервисом).

Если эта опция включена, вы сможете отображать окна сообщений из службы.

person Gart    schedule 07.05.2010
comment
@Jonn: я думаю, есть какой-то API для изменения этого в коде, но в целом на эту опцию не следует полагаться. - person Gart; 10.05.2010

Разрешить службе взаимодействовать с рабочим столом поможет вам сделать это из консоли Services.msc.

НО, это очень плохая идея. Особенно, если вы забудете удалить это окно сообщений позже. Служба зависнет, так как у вас будет окно сообщений, на которое никто не сможет нажать.

person Rahul Soni    schedule 07.05.2010

OS:XP Включение интерактивного режима для служб Windows

Процедура

  1. Откройте панель управления службами. Например: Пуск > Панель управления > Администрирование > Службы.
  2. Выберите службу Cast Iron Secure Connector.
  3. Щелкните правой кнопкой мыши имя службы и выберите Свойства. Появится окно свойств службы.
  4. Выберите вкладку «Вход в систему».
  5. Выберите учетную запись локальной системы, а затем выберите Разрешить службе взаимодействовать с рабочим столом.
  6. Нажмите «ОК».
  7. Щелкните Перезагрузить.
person Ganesh Lohar    schedule 13.02.2012
comment
Это не работает уже более 10 лет. Он не поддерживается в Windows Vista и более поздних версиях. - person Cody Gray; 13.02.2012

Нет, ты не можешь. Службы Windows не имеют графического интерфейса. Но вы можете показать небольшое уведомление в системном трее.

person Marcel    schedule 07.05.2010
comment
Я не думаю, что вы можете это сделать, так как они не взаимодействуют с рабочим столом. - person SqlRyan; 07.05.2010
comment
Не могли бы вы показать мне пример этого? Я пока не рассматривал эту возможность. - person Jonn; 10.05.2010
comment
@Jonn: я не делал этого для себя, но это может помочь вам: msdn.microsoft.com/en-us/magazine/cc188923.aspx. Используйте P/Invoke, чтобы поговорить с ОС. Важно, чтобы вы не вызывали какой-либо компонент графического интерфейса напрямую, так как службы Windows не могут иметь графический интерфейс по своей природе. - person Marcel; 10.05.2010