Порождение дочерних процессов в заставке - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть хранитель экрана, написанный на .NET / C #, который зависит от фонового процесса. Хотя фоновый процесс добавляется в автозагрузку программ пользователя при установке, было бы неплохо не требовать, чтобы пользователь перезагружал свой компьютер после установки заставки. Сам процесс должен выполняться с учетными данными текущего пользователя, поэтому об этом не может быть и речи об использовании службы Windows.

Лучшее решение, о котором я подумал, - это определить, работает ли фоновый процесс при запуске экранной заставки, и запустить его, если нет, просто используя класс Process .NET. Тем не менее, я заметил две несколько связанных с этим проблемы:

1) Похоже, что Windows всегда думает, что хранитель экрана запущен во время выполнения процесса заставки или любого дочернего процесса, созданного хранителем экрана. Конечным результатом этого является то, что заставка запускается сама по себе и порождает процесс, но никогда не запустится снова, потому что Windows считает, что первая заставка все еще активна, потому что фоновый процесс все еще выполняется.

2) Если компьютер настроен на блокировку компьютера при появлении экранной заставки, после выхода из экранной заставки пользователь останется с пустым экраном и должен будет явно нажать ctrl + alt + delete для входа в систему. Это происходит потому, что фоновый процесс выполняется под рабочим столом WinLogon, и снова Windows ожидает выхода заставки.

Есть ли способ обойти это? Лучшее, что я могу придумать, - это найти способ заставить фоновый процесс запускаться как дочерний элемент explorer.exe вместо самой заставки, но я не уверен, каким будет лучший способ сделать это, или если это вообще возможно Я попытался p / вызвать Win32 API метод CreateProcess, а также с различными параметрами, но безуспешно.

1 Ответ

2 голосов
/ 09 января 2012

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

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

...