2011-02-03 6 views
2

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

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

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

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

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

+0

Член STARTUPINFO.lpDesktop имеет значение. Гораздо проще было бы, чтобы ваш установщик только начал процесс. –

+0

Это была первоначальная идея. К сожалению, это может быть установлено удаленно через WMI, чтобы не запускать процесс в контексте текущего пользователя или на рабочем столе. – MisterZimbu

+0

Попробуйте отправить их по электронной почте со ссылкой. –

ответ

2

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

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

+0

Мы закончили решение этого месяца назад, но вторая альтернатива - это в значительной степени подход, который мы приняли. – MisterZimbu