获取 Windows Explorer 的进程句柄

Get Process Handle of Windows Explorer

我想获取 "Windows Explorer" Windows(不是 Internet Explorer)的句柄。

通常它适用于

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

我想做的是:

将特定的资源管理器 Window 带到 ForeGround。 我已经实施了 "ToForeGround" 方法,它适用于除 Windows Explorer

之外的所有其他 Windows

但是使用 Windows Explorer 我只能得到任务栏的进程,与打开的 Windows 无关,只有一个 "Windows Explorer" 进程。

或者有人可以解释一下为什么 "Windows Explorer" 与其他程序不同吗?

can somebody explain me why the "Windows Explorer" is different from other Programms?

这是默认设置 shell. Explorer.exe handles many (user interface) tasks of Windows, some of which are the taskbar, hosting extensions 并且包含文件资源管理器。

它是一个 (sort-of) single-instance process,所以当您启动一个新实例时,它会将参数传递给 运行 实例。

如果您想聚焦或打开某个路径的资源管理器,just use:

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

观点很好,所以让我尝试简要解释一下代码的作用 - 您可以阅读有关 ShellWindows 对象 here 的更多信息。 下面的代码可以帮助您找到 Windows Explorer 的所有 运行 个实例(不是 Internet Explorer,请注意 if 语句中使用的是 "explorer" 而不是 "iexplore")。

添加对 Shell32.dll 的引用,位于 Windows/system32 文件夹中

        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()); 
            }
        }

以下代码遍历所有资源管理器和 Internet 资源管理器 windows(选项卡)(W7/IE11)。 Location URL 将给出正在资源管理器中查看的文件夹。如果该文件夹是您需要置于前台的文件夹,您可以使用 HWND 作为那个 window 并将其置于前台。

"Computer" 的资源管理器 window 的注释位置 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);
    }
}