如何获取资源管理器窗口的信息

软件开发活动,是需要不停地创造新的东西。但更多的时候,可能只是将现有的功能组件合成起来,构建出一个更大型的功能。今天我们我们就来谈谈后者。

如果给你一个窗口句柄,你可以得到什么信息?你可能会知道如下这些信息:
> 它是否是一个资源管理器窗口,如果是的话
> 当前这个窗口显示的是哪个文件夹
> 以及当前哪个文件条目处于选中状态

上面说的这些功能点,其实并不复杂,只是我们需要将很多小型的代码片段拼接到一起,才能实现这些功能。

那我们就从ShellWindows对象开始吧, 这个对象代表了所有已打开的外壳窗口。你可以通过其Item属性来遍历它们。对于C++开发者来说,代码的实现看起来有点繁琐,因为这些外壳对象原本是用来在脚本语言中使用的,例如JScript或者Visual Basic。如下图所示:

如何获取资源管理器窗口的信息_第1张图片

对于每个窗口,我们可以获取其窗口句柄并判断它是否是我们想要的那个,代码如下图所示:

如何获取资源管理器窗口的信息_第2张图片

现在,我们已经通过IWebBrowserApp接口获取了文件夹,接下来我们需要获取顶层的外壳浏览器窗口了。可以通过查询SID_STopLevelBrowser服务并获取IShellBrowser接口,如下图所示:

如何获取资源管理器窗口的信息_第3张图片

从接口IShellBrowser中,我们可以通过QueryActiveShellView方法来获取当前外壳视图,如下图所示:

如何获取资源管理器窗口的信息_第4张图片

当然了,我们真正需要的是一个IFolderView接口,它是一个自动化对象,其中包含了我们需要的所有信息,如下图所示:

如何获取资源管理器窗口的信息_第5张图片

现在,一切准备工作已经完成了,你希望从IFolderView接口中获取什么样的信息呢?
获取一下IShellFolder视图浏览位置如何?我们需要使用IPersistFolder2接口的GetCurFolder方法来做到这一点。GetFolder方法可以让我们能否访问到这个文件夹对象。(在大多数情况下,我们真正需要的就是这个IShellFolder接口,因为我们可以从这个接口中获取很多有用的信息),如下图所示:

如何获取资源管理器窗口的信息_第6张图片

为了显示出结果,我们这里使用了一个转换,将pid1转换为实际的文件路径,如下图所示:

还有上面其他的可以做的呢?哦,对了,我们可以看看当前选中的文件对象,如下图所示:

如何获取资源管理器窗口的信息_第7张图片

接下来,让我们显示选中文件的名称。为了做到这一点,我们需要对象的pidl和IShellFolder接口。主要是使用其Item属性,如下图所示:

如何获取资源管理器窗口的信息_第8张图片

(如果我们希望获取一个选中文件的集合,我们可以传递参数SVGIO_SELECTION到Item方法)

获取了对象的pidl之后,接下来,我们需要获取一下IShellFolder接口:

如何获取资源管理器窗口的信息_第9张图片

然后,我们通过使用GetDisplayNameOf方法来获取对象的显示名称,如下图所示:

如何获取资源管理器窗口的信息_第10张图片

我们可以使用StrRetToBuf函数来将STRRET结构体转换为一个字符串缓冲区:

是时候将以上所有代码片段集合在一起了,下面的代码,看起来有些丑陋,因为我将它们放到了一个巨大的函数中,而没有使用子函数调用。在实际的工程中,我还是会倾向于将它们封装成一个一个的帮助函数,这样就比较容易阅读和维护。
完整版代码如下图所示:

如何获取资源管理器窗口的信息_第11张图片

如何获取资源管理器窗口的信息_第12张图片

如何获取资源管理器窗口的信息_第13张图片

大功告成,让我们来看看如何调用这个大型函数并显示出结果:

如何获取资源管理器窗口的信息_第14张图片

执行我们的例子程序,并将它放置到一边,然后打开一个资源管理器窗口并观察我们的程序的输出结果。

总结

读到这里的读者,我希望你可以明白我的意思:一个大型功能中的所有功能代码,实际上都是已经有了,只是你需要想办法将它们正确的组合到一起。从上面的代码中,我们可以看到,每一项子功能都不是很复杂,但是将它们以一种有趣的方式组合在一起,就需要花费些功夫了。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Querying information from an Explorer window》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

如何获取资源管理器窗口的信息_第15张图片

你可能感兴趣的:(OldNewThing)