2012-06-21 3 views
0

При входе в систему пользователя я запускаю процесс как администратор с помощью CreateProcessWithLogonW в C#.Процесс выхода из CreateProcessWithLogonW при выходе из системы

Когда пользователь теперь выходит из системы, программа не закрывается.

Я хочу, чтобы он закрылся, когда пользователь, который начал его с помощью CreateProcessWithLogonW, вышел из системы. Как мне это сделать?

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

+0

Это сервис Windows? –

+0

Нет, это не сервис Windows. – Zulakis

ответ

0

Я решил эту проблему с помощью HiddenForm, описанной в примере 2. http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx
Это было первоначально для служб Windows, но также работает с приложением Windows-форм без графического интерфейса. Причина, по которой вы не получаете события SessionEnding в приложении без графического интерфейса (также Console-Applications, Windows Services), заключается в том, что он отправляется через Windows Message Pump, который присваивается только каждому открытому окну (в основном).

Для получения дополнительной информации о Windows-сообщения читать эту статью: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644927%28v=vs.85%29.aspx

Чтобы получить этот пример действительно невидимый (хр) также необходимо

this.ShowInTaskbar = false; 
this.WindowState = FormWindowState.Minimized; 
this.Visible = false; 

в HiddenForm.InitializeComponent().

0

Если приложение, которое выдало CreateProcessWithLogonW, все еще работает, вы можете обнаружить, когда Windows начнет выходить из системы и закрывать дочернее приложение. например с помощью SystemEvents.SessionEnding Event

+0

Нет, он больше не работает после запуска программы в качестве администратора. При использовании SystemEvents.SessionEnding в нем я не получаю никаких событий. – Zulakis

+0

Как запустить приложение C# при входе в систему? Возможно ли, чтобы он работал, поэтому он получит событие SessionEnding и отправит некоторый сигнал дочернему приложению. –

+0

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

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