【问题标题】:Windows XP Screen Saver - Launched Process Dies with Screen SaverWindows XP 屏幕保护程序 - 使用屏幕保护程序启动的进程终止
【发布时间】:2009-06-23 15:54:00
【问题描述】:

我正在为一些运行 Windows XP 的信息亭构建一个相当专业的屏幕保护程序。用户往往会在没有将浏览器返回到主页的情况下离开信息亭,因此屏幕保护程序会执行以下操作:

  1. 通过标准屏幕保护机制启动
  2. 通知用户最近没有活动,并且浏览器将在 X 秒后关闭。
  3. 如果 X 秒后没有用户活动,屏幕保护程序会终止所有当前浏览器实例(通过 Process.GetProcessesByName)并启动一个指向配置网站的新浏览器实例(通过 Process.Start)。
  4. 然后屏幕“黑屏”,直到用户移动鼠标或按下某个键 - 此时屏幕保护程序应用程序退出。

当它在 Windows Vista 或 2008 上运行时,一切正常。

但是,在 Windows XP(这是 kiosk 所运行的)上,当屏幕保护程序退出时,浏览器进程会被终止。如果我在屏幕保护程序存在之前添加一个 Thread.Sleep,我可以看到浏览器并与之交互,直到屏幕保护程序退出为止。

为了让事情更加混乱,当我通过单击设置区域中的“预览”按钮运行屏幕保护程序时,Windows XP 不会出现这种行为——也就是说,它的行为与预期相同。在这种情况下运行完全相同的代码。

我在 .NET 2.0 框架下对此进行了测试,后来安装了 .NET 2.0 SP1。在 Windows 2008 工作站上,我有 3.5 SP1。

这些版本的 .NET 在对已启动进程的依赖方面是否存在一些差异?是否可以设置一些标志来确保启动的浏览器进程没有“附加”到屏幕保护程序应用程序?

【问题讨论】:

    标签: c# .net windows-xp


    【解决方案1】:

    有一些 code at CodeProject 封装了 Windows 桌面 API。它包括一个功能,可以在不同的桌面上打开一个新进程,如果不直接使用,您至少可以查看该进程。 (基本上,Windows API CreateProcess 函数有一个参数,可让您指定在哪个桌面上启动进程。)

    如果这不起作用,您也可以尝试my answer to your other question(关于使用 SendMessage 进程间来获取除屏幕保护程序进程之外的另一个进程来实际执行启动)。这不是进程树问题的最佳答案,但如果进程树不是问题,它可能确实有效。

    【讨论】:

    • 我不得不做你的第二个建议(IPC)。我最终使用了新的(到 .NET 3.5)NamedPipeServerStream 和 NamedPipeClientStream 类来实现它,并且效果很好。我首先尝试了第一个建议,但从测试来看,Windows XP 似乎遵循“腰带和吊带”规则:它似乎既杀死了进程树又在不同的桌面上运行,最后 IPC 方法更简单实施。
    【解决方案2】:

    在调用 Process.Start() 之前尝试将 Process.StartInfo.UseShellExecute 设置为 False(默认为 True)。这样,CreateProcess() 在内部使用而不是 ShellExecute()。

    【讨论】:

      【解决方案3】:

      Windows XP 在其自己的虚拟桌面上运行屏幕保护程序。除非您另外指定,否则您从那里启动的任何进程都将继承虚拟桌面作为自己的。屏保退出后,虚拟桌面消失,换成真实桌面,噗!

      编辑:有关详细信息,请参阅这些 Microsoft MSDN 页面:

      Desktops (Windows)
      CreateProcess function (Windows)
      STARTUPINFO Structure

      【讨论】:

      • 这听起来可能是问题所在 - 你如何指定在哪个桌面上运行子进程?
      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 2011-05-29
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2016-07-17
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多