获取Windows资源管理器的进程句柄

时间:2015-01-09 07:32:11

标签: c# windows

我想得到我的" Windows资源管理器" Windows(不是Internet Explorer)。

通常适用于

var processes = Process.GetProcesses();
foreach (var process in processes)
{
    var handle = process.Handle;
}

我想要做的是:

将特定的资源管理器窗口带到ForeGround。 我已经实现了" ToForeGround"方法,它适用于除Windows资源管理器之外的所有其他Windows

但是使用Windows资源管理器我只能获得任务栏的进程,而不受Windows打开程度的影响,只有一个" Windows资源管理器"过程

或者有人可以解释为什么" Windows资源管理器"与其他程序有什么不同?

3 个答案:

答案 0 :(得分:4)

请注意,让我试着简要解释代码的作用 - 您可以阅读有关ShellWindows对象here的更多信息。 下面的代码可以帮助您找到所有正在运行的Windows资源管理器实例(不是Internet Explorer,请注意"资源管理器"在if语句中使用,而不是" iexplore")。

添加对位于Windows / system32文件夹

中的Shell32.dll的引用
        SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();

        string filename;
        ArrayList windows = new ArrayList();

        foreach (SHDocVw.InternetExplorer ie in shellWindows)
        {
            filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
            if (filename.Equals("explorer"))
            {
                //do something with the handle here
                MessageBox.Show(ie.HWND.ToString()); 
            }
        }

答案 1 :(得分:3)

  

有人可以解释为什么“Windows资源管理器”与其他程序不同吗?

这是默认的shell。 Explorer.exe处理Windows的许多(用户界面)任务,其中一些是任务栏hosting extensions并且包含文件浏览器。

它是(sort-of) single-instance process,因此当您启动新实例时,它会将参数传递给正在运行的实例。

如果您希望关注或打开特定路径的资源管理器,just use

Process.Start(@"C:\SomeFolder\");

答案 2 :(得分:3)

以下代码遍历所有资源管理器和Internet Explorer窗口(标签)(W7 / IE11)。位置URL将提供在资源管理器中查看的文件夹。如果文件夹是您需要带到前台的文件夹,则可以使用HWND作为该窗口并将其置于前台。

注意“计算机”的资源管理器窗口的位置URL将为空。我不确定是否还有更多特殊情况。

SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();

foreach (SHDocVw.InternetExplorer window in shellWindows){
    if (window.LocationURL.Contains("Some Folder I am interested in")){
        SetForegroundWindow((IntPtr)window.HWND);
    }
}