Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows XP屏幕保护程序-启动的进程与屏幕保护程序一起死亡_C#_.net_Windows Xp - Fatal编程技术网

C# Windows XP屏幕保护程序-启动的进程与屏幕保护程序一起死亡

C# Windows XP屏幕保护程序-启动的进程与屏幕保护程序一起死亡,c#,.net,windows-xp,C#,.net,Windows Xp,我正在为一些运行WindowsXP的信息亭构建一个专门的屏幕保护程序应用程序。用户倾向于离开信息亭而不将浏览器返回主页,因此屏幕保护程序执行以下操作: 通过标准屏幕保护程序机制启动 通知用户最近没有活动,浏览器将在X秒后关闭 如果X秒过后没有用户活动,屏幕保护程序将终止所有当前浏览器实例(通过Process.getProcessByName),并启动指向已配置网站的浏览器的新实例(通过Process.Start) 然后屏幕会“清空”,直到用户移动鼠标或按下某个键——此时屏幕保护程序应用程序退出

我正在为一些运行WindowsXP的信息亭构建一个专门的屏幕保护程序应用程序。用户倾向于离开信息亭而不将浏览器返回主页,因此屏幕保护程序执行以下操作:

  • 通过标准屏幕保护程序机制启动
  • 通知用户最近没有活动,浏览器将在X秒后关闭
  • 如果X秒过后没有用户活动,屏幕保护程序将终止所有当前浏览器实例(通过Process.getProcessByName),并启动指向已配置网站的浏览器的新实例(通过Process.Start)
  • 然后屏幕会“清空”,直到用户移动鼠标或按下某个键——此时屏幕保护程序应用程序退出
  • 当它在WindowsVista或2008上运行时,一切正常

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

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

    我在.NET2.0框架下对此进行了测试,后来安装了.NET2.0SP1。在Windows2008工作站上,我有3.5SP1


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

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

    Windows XP在其自己的虚拟桌面上运行屏幕保护程序。除非您另行指定,否则从那里开始的任何进程都会将虚拟机作为自己的进程继承。当屏幕保护程序退出时,虚拟桌面将被真正的桌面所取代,然后砰的一声

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



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


    如果这不起作用,您也可以尝试一下(关于使用SendMessage inter进程获得屏幕保护程序进程之外的另一个进程来实际启动)。这不是流程树问题的最佳答案,但如果流程树不是问题所在,它实际上可能会起作用。

    这听起来可能是问题所在-您如何指定在哪个桌面上运行子流程?我必须执行您的第二个建议(IPC)。最后,我使用了新的(to.NET3.5)NamedPipeServerStream和NamedPipeClientStream类来实现它,它运行良好。我首先尝试了第一个建议,但从测试来看,Windows XP似乎遵循了一条“安全带和吊杆”规则:它似乎既可以杀死进程树,又可以在不同的桌面上运行,最后IPC方法更容易实现。