Заставка Windows XP - запущенный процесс умирает с заставкой - PullRequest
0 голосов
/ 23 июня 2009

Я создаю довольно специализированное приложение-заставку для некоторых киосков под управлением Windows XP. Пользователи, как правило, покидают киоски, не возвращая браузер на домашнюю страницу, поэтому заставка делает следующее:

  1. Запускается через стандартный механизм заставки
  2. Уведомляет пользователя, что в последнее время не было никаких действий, и что браузер закроется через X секунд.
  3. Если X секунд проходит без активности пользователя, хранитель экрана убивает все текущие экземпляры браузера (через Process.GetProcessesByName) и запускает новый экземпляр браузера, который указывает на настроенный веб-сайт (через Process.Start).
  4. Экран «гаснет», пока пользователь не перемещает мышь или не нажимает клавишу - в этот момент приложение для заставки закрывается.

Когда это работает в Windows Vista или 2008, все работает как положено.

Однако в Windows XP (то есть, что киоски работают), когда приложение заставки закрывается, процесс браузера убивается. Если я добавлю Thread.Sleep незадолго до того, как появится заставка, я смогу просматривать браузер и взаимодействовать с ним до момента выхода из заставки.

Чтобы еще больше запутать ситуацию, Windows XP НЕ проявляет такого поведения, когда я запускаю заставку, нажимая кнопку «Предварительный просмотр» в области настроек, то есть она ведет себя так, как ожидалось. В этом случае запускается точно такой же код.

Я проверил это в среде .NET 2.0, а затем установил .NET 2.0 SP1. На рабочей станции Windows 2008 у меня 3.5 SP1.

Есть ли какая-то разница между этими версиями .NET относительно зависимостей от запущенных процессов? Можно ли установить какой-либо флаг, чтобы убедиться, что запущенный процесс браузера не «привязан» к приложению заставки?

Ответы [ 3 ]

1 голос
/ 24 июня 2009

В CodeProject есть код , который оборачивает Windows Desktop API. Он включает в себя функцию открытия нового процесса на другом рабочем столе, которую вы, по крайней мере, сможете увидеть, если не будете использовать напрямую. (По сути, в функции Windows API CreateProcess есть параметр, позволяющий указать, на каком рабочем столе запускать процесс.)

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

0 голосов
/ 24 июня 2009

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

Редактировать: Дополнительные сведения см. На следующих страницах Microsoft MSDN:

Рабочие столы (Windows)
Функция CreateProcess (Windows)
СТАРТУПИНФО Структура

0 голосов
/ 24 июня 2009

Попробуйте установить Process.StartInfo.UseShellExecute в False (по умолчанию это True) перед вызовом Process.Start (). Таким образом, CreateProcess () используется внутри вместо ShellExecute ().

...