屏幕保护程序在启动外部进程后不会重新启动

时间:2011-12-03 01:12:46

标签: c# windows screensaver

我正在实现一个屏幕保护程序来重启后台应用程序。我需要重启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 :在七,Vista和XP上,应用程序启动后,屏幕保护程序不会重启;
  • 没有WaitForExit :在Vista / Seven上相同的预备点,在Windows XP上,当屏幕保护程序退出时它也会杀死应用程序!

1 个答案:

答案 0 :(得分:2)

Windows通过在job object中运行屏幕保护程序来保护自己免受您尝试编码的行为,该屏幕保护程序可防止任何进程从作业“转义”开始。这样,当用户不期望时,屏幕保护程序不能使任何进程保持运行。当屏幕保护程序进程终止(WinXP)时,Windows将终止作业(因此所有进程都在其中启动),否则它将等到作业对象本身终止(即作业中的每个进程终止)。

目前尚不清楚为什么要使用屏幕保护程序。我可能会使用在启动时运行的程序或服务来执行此类操作。

无论如何,如果必须使用屏幕保护程序,则必须找到一种从作业对象外部创建进程的方法。需要考虑的一件事是Create method of the Win32_Process Class

根据您要重新启动Firefox的指示,听起来您有一个Internet kiosk类型的应用程序,您希望在用户离开自助服务终端时重新启动浏览器。在那种情况下,我会完全推荐别的东西:

  • 创建一个启动Firefox的程序,等待它退出,然后重新启动它,所有程序都在无限循环中运行。使用某种类似AutoRuns的机制运行该程序。

  • 让屏幕保护程序简单地杀死Firefox并退出。当屏幕保护程序激活时,它将终止Firefox并退出,导致循环程序重新启动它。