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

我正在实现一个屏幕保护程序来重新启动后台应用程序。 我需要重新启动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上,当屏幕保护程序退出时它也会杀死应用程序!

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

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

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

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

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

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