Заставка не перезапускается после запуска внешнего процесса - PullRequest
0 голосов
/ 03 декабря 2011

Я внедряю заставку для перезапуска фонового приложения.Мне нужно перезагрузить Firefox, чтобы сбросить домашнюю страницу в киоске Windows.Я хотел бы сделать это с помощью заставки.Я использую язык C #.

Код не такой сложный и является своего рода копией и вставкой из

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686421(v=vs.85).aspx

и

http://www.harding.edu/fmccown/screensaver/screensaver.html

Должно работать следующим образом: заставка запускается, потом через 10 сек.убивает приложение (если оно существует) и затем, через 10 сек.снова перезапускает приложение.После того, как вся заставка закрылась (есть таймер, который управляет этим).

Проблема в том, что процесс, запущенный заставкой, имеет своего рода ссылку на убитую заставку, потому что, пока пользователь не 'Чтобы убить приложение, заставка не перезапускается!

Я использую эту функцию для перезапуска приложения:

public static void StartAProcess(string executableName)
{
    //Process.Start(new ProcessStartInfo(executableName));

    RunThread ext = new RunThread();
    Thread t = new Thread(new ParameterizedThreadStart(ext.OpenProcess));
    t.Start(executableName.ToString());
}


public class RunThread
{
    public void OpenProcess(object executableName)
    {
        ProcessStartInfo si = new ProcessStartInfo();
        si.UseShellExecute = true;
        si.FileName = (string) executableName;
        Process proc = Process.Start(si);
        ---> if (null != proc)
             proc.WaitForExit();   // Block until exit**
    }
}

Поведение отличается в зависимости от ОС и WaitForExitинструкция:

  • с WaitForExit : на Seven, Vista и XP после запуска приложения заставка не перезапускается;
  • без WaitForExit : в Vista / Seven та же точка начала, в Windows XP при выходе из заставки это тоже убивает приложение!

1 Ответ

2 голосов
/ 03 декабря 2011

Windows защищает себя от поведения, которое вы пытаетесь закодировать, запуская экранную заставку в объекте задания , который предотвращает "выход" любого процесса из задания. Таким образом, заставка не может оставлять запущенные процессы, когда пользователь этого не ожидает. Windows либо завершит задание (и, следовательно, все процессы, запущенные в нем), когда завершится процесс экранной заставки (WinXP), или дождется завершения самого объекта задания (т. Е. Завершится каждый процесс в задании).

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

Независимо от того, если вам нужно использовать заставку, вы должны найти способ создать процесс за пределами вашего рабочего объекта. Следует учитывать один метод Create класса Win32_Process .

Исходя из того, что вы хотите перезапустить Firefox, похоже, что у вас есть приложение типа интернет-киоска, в котором вы хотите перезапустить браузер, когда пользователь покинул киоск. В этом случае я бы порекомендовал что-то еще:

  • Создайте программу, которая запускает Firefox, ждет его завершения, а затем перезапускает, все работает в бесконечном цикле. Запустите эту программу, используя какой-нибудь механизм, похожий на автозапуск.

  • Заставка заставит вас просто убить Firefox и выйти. Когда заставка активируется, она убивает Firefox и завершает работу, вызывая перезапуск программы зацикливания.

...