我正在为运行Windows XP的一些信息亭构建一个相当专业的屏幕保护程序。用户倾向于离开自助服务终端而不将浏览器返回主页,因此屏幕保护程序会执行以下操作:
当它在Windows Vista或2008上运行时,一切都按预期工作。
但是,在Windows XP(运行自助服务终端)上,当屏幕保护程序退出时,浏览器进程将被终止。如果我在屏幕保护程序存在之前添加Thread.Sleep,我可以看到浏览器并与之交互,直到屏幕保护程序退出。
更令人困惑的是,当我通过单击设置区域中的“预览”按钮运行屏幕保护程序时,Windows XP不会出现此行为 - 也就是说,它的行为符合预期。在这种情况下运行完全相同的代码。
我在.NET 2.0框架下测试了这个,后来安装了.NET 2.0 SP1。在Windows 2008工作站上,我有3.5 SP1。
这些版本的.NET在启动进程的依赖性方面是否存在一些差异?是否有一些标志我可以设置以确保启动的浏览器进程没有“附加”到屏幕保护程序应用程序?
答案 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