如何查找最近访问的文件资源管理器窗口

时间:2018-03-07 19:21:52

标签: explorer z-order

我正在尝试识别桌面上最近访问(使用过的)文件资源管理器窗口。我使用EnumWindows过滤掉所有顶级窗口,最后得到一个看起来与ALT-TAB显示中看起来大致相同的集合。

我想将最近访问过的文件资源管理器窗口带到前台,但我有两个问题。

首先,如何识别资源管理器窗口。无法使用窗口标题,因为标题取决于访问过的文件夹。我想我可以通过使用窗口句柄获取processID并使用processID来获取进程名称,类名或启动进程的可执行文件(例如" explorer.exe"或&# 34; CabinetEtc"。)

或者,我可以将EnumWindows用于其他窗口并使用Shell32.Shell调用直接获取Shell32.ShellFolderView窗口的列表。所以,我们假设我可以识别一组三个或四个窗口,它们是文件浏览器窗口。

其次,我怎么知道哪一个是最近访问过的?我以为我可以以某种方式查看z顺序,并选择z顺序中最高的窗口。我不知道如何访问z顺序,虽然我已经在文档中读到了它。(我也希望每个桌面有一个z顺序列表,因为我有三个监视器,并且浏览器窗口可以打开不同的监视器。)

或者,我在API文档中看不到最近访问过的资源管理器窗口的时间戳?

如果有人能指出我正确的方向,如何在一组窗口内找到MRA窗口的示例或文档,我将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

我无法找到有关查找最近使用的文件浏览器窗口的任何内容。这听起来很简单,但经过相当多的实验后,看起来FindWindows返回的窗口列表是MRU顺序。

因此,为了找到特定类型/类的最近使用的窗口,我使用FindWindows列出一组窗口,然后向下搜索列表以查找第一个匹配项。第一场比赛似乎是我追求的MRU窗口。

例如,假设我FindWindows所有具有非空标题字符串的窗口,然后使用foreach以正常循环方式循环遍历该集合。发现的第一个匹配看起来像是MRU窗口(至少它在我的所有手动测试用例中)。

我没有证据证明当Windows可能会收到激活消息或其他任何改变它们在FindWindows输出列表中的位置时此算法有效。我只是在搜索由用户手动激活的MRU窗口。

一个未解决的难题是Dragon NaturallySpeaking的窗口始终位于列表的顶部。也许它已为自己设置了AlwaysOnTop属性,或者它可能始终处于活动状态,并且由于某种原因是列表中的顶级MRU窗口。那里发生了一些事情,但我不知道是什么。