【问题标题】:screensaver does not restart after it launches an external process启动外部进程后,屏幕保护程序不会重新启动
【发布时间】:2023-03-23 23:22:01
【问题描述】:

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

【问题讨论】:

  • 大餐后睡着了?
  • 那个糟糕的外部进程 ;)
  • 它总是有这个问题,还是只有在屏幕保护程序安全时(即它需要密码才能回到您的桌面)?
  • 请不要在您的问题前加上“C#:”。这就是标签的用途。
  • 屏幕保护程序不安全。

标签: c# windows screensaver


【解决方案1】:

Windows 通过在job object 中运行屏幕保护程序来保护自己免受您尝试编写代码的行为的影响,从而防止任何启动的进程从作业中“逃脱”。这样,屏幕保护程序就不会在用户不期望的情况下让任何进程运行。当屏幕保护程序终止 (WinXP) 时,Windows 将终止作业(以及因此在其中启动的所有进程),或者它将等到作业对象本身终止(即作业中的每个进程都终止)。

不清楚您为什么要为此使用屏幕保护程序。我可能会使用在启动时运行的程序或服务来做这样的事情。

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

根据您要重新启动 Firefox 的指示,听起来您有一个 Internet 信息亭类型的应用程序,您希望在用户离开信息亭时重新启动浏览器。在那种情况下,我会完全推荐其他东西:

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

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

【讨论】:

  • 我需要一个屏幕保护程序,因为我想重新启动 firefox 进程以将状态重置为主页。屏幕保护程序隐藏 firefox kill 并重新启动。
  • C#指令 Process.Start(...) 和你建议的 Create 方法不一样吗?
  • @robob:不,这完全是另外一回事。但是,您的描述让我觉得您需要一种不同的方法。请参阅我的答案的编辑。
  • 谢谢,我会试试你的建议。我看到另一个帖子,您认为调用“Process.Start("cmd.exe", "/c start firefox.exe")" 可以吗?
  • @robob:Process.Start 无论你执行什么过程,都不会从屏幕保护程序中做你想做的事情。
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多