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

时间:2009-06-23 15:54:00

标签: c# .net windows-xp

我正在为运行Windows XP的一些信息亭构建一个相当专业的屏幕保护程序。用户倾向于离开自助服务终端而不将浏览器返回主页,因此屏幕保护程序会执行以下操作:

  1. 通过标准屏幕保护程序机制启动
  2. 通知用户最近没有活动,浏览器将在X秒内关闭。
  3. 如果X秒没有用户活动,屏幕保护程序将终止所有当前浏览器实例(通过Process.GetProcessesByName)并启动指向配置的网站的新浏览器实例(通过Process.Start)。
  4. 屏幕然后“消隐”,直到用户移动鼠标或按键 - 此时屏幕保护程序应用程序退出。
  5. 当它在Windows Vista或2008上运行时,一切都按预期工作。

    但是,在Windows XP(运行自助服务终端)上,当屏幕保护程序退出时,浏览器进程将被终止。如果我在屏幕保护程序存在之前添加Thread.Sleep,我可以看到浏览器并与之交互,直到屏幕保护程序退出。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Windows XP在自己的虚拟桌面上运行屏幕保护程序。除非另行指定,否则从该处开始的任何进程都将继承虚拟桌面。当屏幕保护程序退出时,虚拟桌面将被真正的桌面取代,并且poof!

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

Desktops (Windows)
CreateProcess function (Windows)
STARTUPINFO Structure