我正在实现一个屏幕保护程序来重启后台应用程序。我需要重启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指令,行为会有所不同:
答案 0 :(得分:2)
Windows通过在job object中运行屏幕保护程序来保护自己免受您尝试编码的行为,该屏幕保护程序可防止任何进程从作业“转义”开始。这样,当用户不期望时,屏幕保护程序不能使任何进程保持运行。当屏幕保护程序进程终止(WinXP)时,Windows将终止作业(因此所有进程都在其中启动),否则它将等到作业对象本身终止(即作业中的每个进程终止)。
目前尚不清楚为什么要使用屏幕保护程序。我可能会使用在启动时运行的程序或服务来执行此类操作。
无论如何,如果必须使用屏幕保护程序,则必须找到一种从作业对象外部创建进程的方法。需要考虑的一件事是Create method of the Win32_Process Class。
根据您要重新启动Firefox的指示,听起来您有一个Internet kiosk类型的应用程序,您希望在用户离开自助服务终端时重新启动浏览器。在那种情况下,我会完全推荐别的东西:
创建一个启动Firefox的程序,等待它退出,然后重新启动它,所有程序都在无限循环中运行。使用某种类似AutoRuns的机制运行该程序。
让屏幕保护程序简单地杀死Firefox并退出。当屏幕保护程序激活时,它将终止Firefox并退出,导致循环程序重新启动它。