У меня есть хранитель экрана, написанный на .NET / C #, который зависит от фонового процесса. Хотя фоновый процесс добавляется в автозагрузку программ пользователя при установке, было бы неплохо не требовать, чтобы пользователь перезагружал свой компьютер после установки заставки. Сам процесс должен выполняться с учетными данными текущего пользователя, поэтому об этом не может быть и речи об использовании службы Windows.
Лучшее решение, о котором я подумал, - это определить, работает ли фоновый процесс при запуске экранной заставки, и запустить его, если нет, просто используя класс Process .NET. Тем не менее, я заметил две несколько связанных с этим проблемы:
1) Похоже, что Windows всегда думает, что хранитель экрана запущен во время выполнения процесса заставки или любого дочернего процесса, созданного хранителем экрана. Конечным результатом этого является то, что заставка запускается сама по себе и порождает процесс, но никогда не запустится снова, потому что Windows считает, что первая заставка все еще активна, потому что фоновый процесс все еще выполняется.
2) Если компьютер настроен на блокировку компьютера при появлении экранной заставки, после выхода из экранной заставки пользователь останется с пустым экраном и должен будет явно нажать ctrl + alt + delete для входа в систему. Это происходит потому, что фоновый процесс выполняется под рабочим столом WinLogon, и снова Windows ожидает выхода заставки.
Есть ли способ обойти это? Лучшее, что я могу придумать, - это найти способ заставить фоновый процесс запускаться как дочерний элемент explorer.exe вместо самой заставки, но я не уверен, каким будет лучший способ сделать это, или если это вообще возможно Я попытался p / вызвать Win32 API метод CreateProcess, а также с различными параметрами, но безуспешно.