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

本文关键字:进程句柄 资源管理器 Windows 获取 | 更新日期: 2023-09-27 18:36:47

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

通常它适用于

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

我想做的是:

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

。但是使用Windows资源管理器,

我只能获得任务栏的进程,而与打开的Windows数量无关,只有一个"Windows资源管理器"进程。

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

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

观点很好,所以让我尝试简要解释一下代码的作用 - 你可以在这里阅读更多关于 ShellWindows 对象的信息。下面的代码可帮助您查找所有正在运行的 Windows 资源管理器实例(不是 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()); 
            }
        }

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

它是默认外壳。资源管理器.exe处理Windows的许多(用户界面)任务,其中一些是任务栏,托管扩展和托管文件资源管理器。

这是一个(某种)单实例进程,因此当您启动新实例时,它会将参数传递给正在运行的实例。

如果要在某个路径上聚焦或打开资源管理器,只需使用:

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

以下代码遍历所有资源管理器和 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);
    }
}