2010-05-07 5 views
18

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

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

но это не сработало и только что произвело ошибку.

ответ

19

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

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

+0

Ох .. Я надеялся на общий обработчик исключений, который уведомит пользователя, если возникла ошибка с сервисом.В некоторых случаях он будет кратковременно разбиваться, и пользователи не будут знать, что служба потерпела крах. – Jonn

+0

Я использую окна сообщений все время при попытке отладки. Это быстрый и простой способ узнать, какие проблемы могут произойти. НИКОГДА не используйте окно сообщения в релизе! Всегда используйте журнал событий при создании выпуска! Чтобы использовать окно сообщений для целей отладки, просто добавьте ссылку System.Windows.Forms на ваш проект. –

+0

Я хочу сообщить пользователю, что я не могу регистрировать события. Но единственный способ - это зарегистрировать событие? Это неудобно. – user922020

-2

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

+1

Я не думаю, что вы можете это сделать, так как они не имеют никакого взаимодействия с рабочим столом. – SqlRyan

+0

Не могли бы вы показать мне пример этого? Я еще не рассматривал эту возможность. – Jonn

+0

@Jonn: Я не сделал этого для себя, но это может помочь вам: http: //msdn.microsoft.com/en-us/magazine/cc188923.aspx. Используйте P/Invoke для разговора с ОС. Важно, чтобы вы не вызывали какой-либо компонент GUI напрямую, поскольку Windows Services не может иметь графический интерфейс по дизайну. – Marcel

0

От Wikipedia:

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

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

+0

Вы можете включить это в код? – Jonn

+0

@Jonn: Я думаю, что есть некоторый API, чтобы изменить это в коде, но в целом на эту опцию не следует полагаться. – Gart

0

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

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

-1

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

Процедура

  1. Откройте панель управления Сервисом. Например: Пуск> Панель управления> Администрирование> Службы.
  2. Выберите Службу безопасного крепления для чугуна.
  3. Щелкните правой кнопкой мыши имя службы и выберите «Свойства». Откроется окно «Свойства службы».
  4. Выберите вкладку «Вход в систему».
  5. Выберите Локальная системная учетная запись, а затем выберите Разрешить службе взаимодействовать с рабочим столом.
  6. Нажмите OK.
  7. Нажмите «Перезагрузка».
+1

Это не работает более 10 лет. Он не поддерживается в Windows Vista и более поздних версиях. –

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