2011-01-28 191 views
3

我有一个频繁使用启动explorer.exe的应用程序。我想重新使用现有的/已经打开的浏览器窗口,而不是每次启动过程时创建一个新窗口。如何重新使用现有/已打开的Windows资源管理器窗口启动资源管理器

这里是我的代码如下所示:

System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo 
     { 
      UseShellExecute = true, 
      FileName = "Explorer.exe", 
      Arguments = myDirectoryPath 
     }; 
     System.Diagnostics.Process.Start(info); 

我没有看到一个command-line开关来做到这一点。一种方法我试过是简单地杀死任何1个现有Explorer进程,并用一个新的更换:

var processes = System.Diagnostics.Process.GetProcesses(Environment.MachineName);int kills = 0; 
     for (int i = 0; i < processes.Length; i++) 
     { 
      System.Diagnostics.Process p = processes[i]; 
      if (p.ProcessName == "explorer" && kills < 1) 
            ++kills 
       p.Kill(); 
     } 

但是这导致的不不必要的影响只是杀死1点的过程,但彻底查杀探险以至于连任务栏消失。

那么,如何使用现有的Explorer窗口(如果存在)来启动Explorer?

+0

如果您的用户有一个资源管理器窗口打开到一个目录由于其他原因,并不想成为从该目录中取出?你认为这种方法会导致你的用户感到沮丧吗? – Phil 2011-01-28 17:31:01

+0

这是一个值得关注的问题,但我的用户表示他们只是说他们想重新使用任何现有的资源管理器窗口,而不是让我的应用每次都打开新的副本。否则,我不得不确定哪些浏览器窗口是由我的应用程序打开的,只能重新使用这些窗口。 – 2011-01-28 18:41:31

回答

1

IShellWindows COM界面会给你一个打开的资源管理器窗口列表,你可以获取并设置任何资源管理器窗口的地址,参见this blog entry获取C++示例。我怀疑.NET有一个本地实现这个,所以你可能需要PInvoke

0

另一种选择是(如果你不知道你已经打开/想要重用的资源管理器窗口的HWND)枚举和查找窗口的标题“看起来像”你想要什么,然后指示该窗口来到前台。它不会透露你想要在其中的确切文件,但它可能比其他选项更简单:)