以编程方式确定快速启动工具栏中项目的顺序本质上是脆弱的。没有为此公开 API,这意味着它可能会在未来的 Windows 版本中发生变化,从而破坏依赖于未记录实现细节假设的代码。
但是,在这种特定情况下,问题比通常情况下要少,因为“快速启动”工具栏不再存在(或者,至少,没有人再使用它了)。使用快速启动工具栏的最后一个 Windows 版本是 Vista,因此如果您确保您的代码与 Vista 和更早版本兼容,您应该没问题。无论如何,它不适用于较新的版本。
快速启动工具栏中项目的位置存储在注册表中的以下键中:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop
您可以从那里提取信息,解析和解释它,然后随意使用它。正如您所提到的,这些信息不是以纯文本形式存储的,因为这对于 shell 加载和解析自身来说会非常慢。由于这是未记录的并且不是为客户使用而设计的,因此他们在使其用户(或开发人员)友好方面没有特别的好处。重要的是什么对 shell 最有效,从其内部结构存储二进制信息是显而易见的选择。
您需要对其进行逆向工程,以使其对您有用。我采取的方法可能是通过在快速启动栏中以特定顺序设置几个项目的测试环境,从注册表中导出信息,移动其中一个项目,从注册表,并比较两个导出的注册表文件以查看发生了什么变化。冲洗并根据需要重复多次以推断图案。(真的让你想知道为什么这么多开发人员确实花时间对 Windows 的未记录方面进行逆向工程,不是吗?)
另一种选择是使用 Spy++ 来调查实现任务栏及其快速启动工具栏的窗口。我没有 Windows 7 之前的系统,但听起来您已经完成此操作并确定快速启动工具栏是使用标准 ListView 实现的。如果您知道该窗口的名称(及其祖先窗口的名称),您可以遍历这些窗口以获得您感兴趣的窗口的句柄。然后您可以确定窗口中项目的顺序就好像它是您自己的应用程序中的标准 ListView。
ListView 控件的文档在这里;这应该让您朝着正确的方向开始。LVM_GETITEMTEXT
您可以通过发送消息获取其中一个子项的文本。
这可能是更简单的方法。同样的警告适用 - 没有什么可以阻止未来版本的 Windows 更改这些窗口的名称或任务栏的实现方式,但是因为具有快速启动工具栏的唯一版本的 Windows 已经发布(因此不太可能改变),这可能不是一个大问题。
再说一次,考虑到快速启动工具栏已经过时的事实,我很难理解为什么这项努力甚至值得投入开发人员的时间。
此外,即使您编写并安装了该程序,也要考虑当用户将新项目添加到快速启动工具栏或重新排列现有项目时会发生什么。您的实用程序如何知道这一点并相应地调整键盘快捷键?如果安装程序从快速启动工具栏中添加/删除项目怎么办?