c#通过winapi读取syslistview32项目工具提示

时间:2012-07-13 11:07:16

标签: c# winapi sendmessage syslistview32 quicklaunch

我想写一个应用程序,它在windows xp下读取顺序中的快速启动项,就像它们位于任务栏中一样, 并为每个项目设置热键。 windows + 1应该启动第一个应用程序 windows + 2第二个等 (比如在Windows 7中)

所有这些项目都在我的文件夹中找到,但如果我读了这个文件夹的项目,我就得不到这些项目的正确顺序。

我发现两个解决方案得到正确的顺序 - 第一:

在注册表中找到一个条目,其中保存了它们的位置,但不是纯文本。我不知道怎么读这个,并且无法反转它。

第二个: 从任务栏通过winapi读取项目工具提示,因此我可以(如果没有相同名称的项目)通过快速启动文件夹中的名称进行搜索。 快速启动栏只是一个列表视图(syslistview32)。 通过sendmessage我得到它的工作来计算项目,并启动一个(假设点击这个项目),但我怎么能读到工具提示? 我已经google了很多,尝试了一切,但我没有让它运行。

我希望你能为我解决这个问题。

欢呼声

1 个答案:

答案 0 :(得分:0)

以编程方式确定“快速启动”工具栏中的项目顺序本身就很脆弱。没有为此公开API,这意味着它可能会在未来的Windows版本中发生变化,从而破坏了依赖于未记录的实现细节假设的代码。

然而,在这种特定情况下,这不像通常那样存在问题,因为快速启动工具栏不再存在(或者,至少,没有人再使用它)。使用“快速启动”工具栏的Windows的最后一个版本是Vista,因此如果您确保您的代码与Vista及更早版本兼容,那么您应该没问题。无论如何它都不适用于新版本。

“快速启动”工具栏中项目的位置存储在注册表中的以下项中:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop

您可以从那里提取信息,解析并解释它,然后根据需要使用它。如您所述,此信息不以纯文本格式存储,因为shell加载和解析自身的速度非常慢。由于这是未记录的,并非设计为客户使用,因此它们对于使用户(或开发人员)友好没有特别的好处。重要的是对shell最有效,并且从内部结构中存储二进制信息是显而易见的选择。

您需要对此进行反向工程,以使其对您有用。我的方法可能是通过以特定顺序在快速启动栏中设置几个项目的测试环境,从注册表中导出信息,移动其中一个项目,从中导出更新的信息注册表,并比较两个导出的注册表文件,以查看更改的内容。根据需要冲洗并重复多次以推断出图案。 (真的让你想知道为什么这么多开发人员花时间对Windows的无证方面进行逆向工程,不是吗?)

另一种选择是使用Spy ++来研究实现任务栏及其快速启动工具栏的窗口。我没有Windows 7之前的系统,但听起来你已经完成了这个问题,并确定使用标准ListView实现了Quick Launch工具栏。如果您知道该窗口的名称(以及其祖先窗口的名称),您可以浏览这些窗口以获取您感兴趣的窗口的句柄。然后您可以确定窗口中项目的顺序好像它是你自己的应用程序中的标准ListView。

ListView控件的文档是here;那会让你开始朝着正确的方向前进您可以通过发送LVM_GETITEMTEXT message来获取其中一个子项的文本。

这可能是更简单的方法。同样的警告适用 - 没有什么能阻止Windows的未来版本更改这些窗口的名称或实现任务栏的方式,但是因为已经发布了具有“快速启动”工具栏的Windows的唯一版本(因此不太可能改变),这可能不是一个大问题。

然后,考虑到快速启动工具栏的过时,我很难理解为什么这项努力甚至值得投资开发人员时间。

此外,即使您已编写并安装此程序,也请考虑当用户将新项目添加到“快速启动”工具栏或重新排列现有项目时会发生什么。您的实用程序如何知道并相应地调整键盘快捷键?如果安装程序从“快速启动”工具栏添加/删除项目会怎样?