Windows XP屏幕保护程序 - 使用屏幕保护程序启动过程死亡

问题描述:

我正在为运行Windows XP的某些信息亭构建一个相当专业的屏幕保护程序。用户往往会离开亭没有浏览器返回到首页,让屏幕保护程序执行以下操作:通过标准屏幕保护机制 Windows XP屏幕保护程序 - 使用屏幕保护程序启动过程死亡

    1. 推出通知用户一直没有最近的活动,并浏览器将在X秒内关闭。
    2. 如果X秒内通过,而无需用户活动,屏幕保护程序杀死所有当前浏览器实例(通过Process.GetProcessesByName),并开始指向配置的网站(通过的Process.Start)浏览器的新实例。
    3. 屏幕然后“空白”,直到用户移动鼠标或按下一个键 - 此时屏幕保护程序退出。

    当这个运行在Windows Vista或2008,按预期工作的一切。

    然而,在Windows XP(这是亭正在运行的),当保护程序退出屏幕,浏览器进程被终止。如果在屏幕保护程序存在之前添加Thread.Sleep,则可以查看浏览器并与其进行交互,直到屏幕保护程序退出。

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

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

    有相对于依赖于启动的进程,这些版本的.NET之间存在一些差异?是否有一些标志可以确保启动的浏览器进程不会“附加”到屏幕保护程序?

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

    如果这样不起作用,您可能还会尝试使用my answer to your other question(关于使用SendMessage进程间获取除屏幕保护程序以外的另一个进程实际执行启动)。这并不是解决流程树问题的最佳答案,但如果流程树不是问题,它可能会真正起作用。

    +0

    我不得不做你的第二个建议(IPC)。我最终使用了新的(.NET 3.5)NamedPipeServerStream和NamedPipeClientStream类来实现它,它运行良好。 我首先尝试了第一个建议,但是从测试中看来,Windows XP似乎遵循一个“带和吊带”规则:它似乎既杀死进程树又运行在不同的桌面上,最后IPC方法是更容易实施。 – user127665 2009-06-26 15:21:42

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

    Windows XP在其自己的虚拟桌面上运行屏幕保护程序。除非另有说明,否则从此处开始的任何进程都将继承自己的虚拟桌面。当屏幕保护程序退出时,虚拟桌面将消失并被真正的桌面所替代,并且可以!

    编辑:欲了解更多信息,请参阅以下微软MSDN网页:

    Desktops (Windows)
    CreateProcess function (Windows)
    STARTUPINFO Structure

    +0

    这听起来像它可能是问题 - 你如何指定运行子进程的桌面? – user127665 2009-06-24 05:15:46