Как показать форму в службе Windows. - PullRequest
4 голосов
/ 06 марта 2011

Я хочу загрузить форму в методе OnStart () в моей службе Windows;вот мой кодЭто не работает.Можете ли вы оказать какую-либо помощь?

protected override void OnStart(string[] args)
{
    Form1 fr = new Form1();
    fr.Show();
}

Ответы [ 4 ]

2 голосов
/ 06 марта 2011

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

Как установить связь вы можете прочитать на MSDN и в этом примере . Некоторые идеи также описаны в StackOverflow .

1 голос
/ 06 марта 2011

Сервисы запускаются на разных оконных станциях и десктопах для любого интерактивного пользователя.Даже если форма загружена успешно, никто не сможет ее увидеть.

Вы можете установить опцию «Разрешить службе взаимодействовать с рабочим столом», которая позволяет службе совместно использовать оконную станцию ​​консоли.Однако это действительно плохая идея.Это открывает дыры в безопасности и множество других проблем.Например, что произойдет, если в систему вошли более одного пользователя?Или, если вы используете терминальные сервисы?

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

0 голосов
/ 06 марта 2011

Чтобы служба отображала окно, оно должно быть помечено как «Разрешить взаимодействие с рабочим столом». Это может быть сделано установщиком службы или на странице свойств для этой службы.

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

Лучшее решение - иметь отдельное приложение с графическим интерфейсом, которое взаимодействует со службой через некоторый механизм IPC.

0 голосов
/ 06 марта 2011

Для графического интерфейса требуется Однопоточная квартира модель с резьбой.Для форм требуется насос сообщений (например, тот, который был запущен Application.Run).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...