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

4

我想获取“Windows资源管理器”窗口的句柄(不是Internet Explorer)。

通常情况下,可以使用以下代码实现:

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

我想做的是以下内容:
将特定的资源管理器窗口带到前台。
我已经实现了“ToForeGround”方法,对于除Windows资源管理器以外的所有其他窗口都有效。
但是对于Windows资源管理器,无论打开多少个窗口,我只能得到任务栏上的进程,只有一个“Windows资源管理器”进程。
或者有人能解释一下为什么“Windows资源管理器”与其他程序不同吗?

1
你会用这个句柄做什么?这几乎肯定是一个更大的问题/解决方案的一部分,几乎可以确定,这一步是错误的 - 但是如果不知道更大的上下文是什么,我就无法指向更好的解决方案。那么你实际上想要做什么? - Damien_The_Unbeliever
我“只是”想将它带到前台。我正在编写类似于Alt + Tab的东西。 而且我知道我的解决方案不起作用。 - Jens
你想要访问哪个资源管理器窗口?我相信你最终会将这个句柄发送给SetForegroundWindow。 - danish
一个进程创建多个顶级窗口是完全正常的。这是否让您感到困惑? - David Heffernan
我目前不关心一个进程中有多个窗口。也许以后会添加类似的功能。 也许我也不需要句柄。我想要做的唯一一件事就是将资源管理器窗口置于前台。 - Jens
显示剩余2条评论
3个回答

5
很好,让我简要解释一下代码的功能 - 您可以在此处阅读更多有关ShellWindows对象的信息。 以下代码可帮助您查找所有正在运行的Windows资源管理器实例(注意不是Internet Explorer,if语句中使用了“explorer”而不是“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()); 
            }
        }

2
“试一下”不是一个好的答案。请解释代码的作用,千万不要使用ArrayList,否则我们会认为你从2000年代的网站上复制了这段代码。 - CodeCaster
我使用了 try 因为我不确定 OP 想要做什么,因此这个解决方案可能适用或不适用于他,这里是一篇文章的链接,也许可以帮助他 http://omegacoder.com/?p=63 - TH Todorov
1
如果您不理解代码的作用,最好不要回答,并在评论中发布类似“这有帮助吗?”的链接。 - CodeCaster
我已经看过这两篇文章。但是我不明白那里在说什么。我的问题是: 对于SHDocVw版本: 看起来这正是我想要的Internet Explorer功能!如何将其应用到Windows Explorer?我记得我尝试过,但没有成功。对于Omegacode: 如果我没记错的话,那么这段代码是C/C++代码。我如何在我的C#程序中使用它? - Jens
1
向CodeCaster致敬 - 这篇文章解释了代码的作用,如果你很难理解它,你可能需要放下态度并寻求帮助。 - TH Todorov
显示剩余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);
    }
}

3

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

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

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

如果您想要 聚焦或打开 特定路径的资源管理器,只需使用

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

好的,谢谢你的回答! 我稍后会读关于Shell的文章,但我认为你的回答很好,帮助我更好地理解它。 - Jens
我知道Process.Start(@“C:\ SomeFolder \”);但那不是我想要的:/ 这是另一种用例,我可以将其实现到我的程序中,但实际上我想要做的是能够对打开的窗口执行某些操作。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接