2012-07-13 29 views
0

我想写一个应用程序,该应用程序在windows xp下按照它们位于任务栏 中的顺序读取快速启动项目,并为每个项目设置热键。 窗+ 1应该启动第一应用窗口 + 2的第二等 (如在窗口7)c#通过winapi读取syslistview32项目工具提示

所有这些项目被找到IA文件夹,但如果我读取此文件夹中的项目,我不得到这些项目的正确顺序。

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

注册表

条目中发现,在其保存它们如何定位,而不是纯文本格式。我不知道如何阅读这个,并且不能逆转引擎。

第二个: 通过winapi从任务栏读取项目工具提示,所以我可以(如果没有具有相同名称的项目)通过快速启动文件夹中的名称进行搜索。 快速启动栏只是一个listview(syslistview32)。 通过sendmessage我得到它的工作来计算项目,并开始一个(伪造一个点击这个项目),但我怎么可以阅读tooltip? 我GOOGLE了很多,试过一切,但我没有得到它运行。

我希望你有任何代码片段可以解决这个问题。

欢呼

回答

0

确定快速启动工具栏中的项的顺序编程将是固有的脆弱。这里没有公开API,这意味着它可能会在未来的Windows版本中发生变化,违反了依赖于未记录的实现细节假设的代码。

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

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

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

你可以从那里提取信息,分析和解释,然后只要你喜欢用它。正如你所提到的,这些信息并不是以纯文本格式存储的,因为这对于shell加载和解析本身来说非常慢。由于这是没有文档记录的,并且不是为了客户使用而设计的,它们在使用户(或开发人员)友好方面没有特别的好处。重要的是对于shell最有效,并且从内部结构存储二进制信息是明显的选择。

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

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

ListView控件的文档是here;这应该让你开始正确的方向。您可以通过发送LVM_GETITEMTEXT message来获取其中一个子项目的文本。

这可能是更简单的方法。同样的注意事项也适用 - 没有什么能保证未来版本的Windows不会更改这些窗口的名称或实现任务栏的方式,但是由于具有快速启动工具栏的唯一版本的Windows已经发布(因此不可能改变),这可能不是一个大问题。

再次,随着Quick Launch工具条过时的事实,我很难理解为什么这种努力甚至值得投资开发者时间。另外,即使您已经完成所有编写和安装的程序,请考虑用户将新项目添加到快速启动工具栏或重新排列现有项目时会发生什么情况。您的实用程序如何知道并相应地调整键盘快捷键? 安装程序如何在“快速启动”工具栏中添加/删除项目?

+0

嗨,谢谢你的回答。我尝试了这种逆向工程,没有成功。我知道我必须发送lvm_getitemtext消息 - 但发送它没有成功,也许我做错了,我从来没有得到有用的内容。但我知道我拥有的手柄是正确的,因为我可以成功计数这些项目,并且点击其中一个也可以。 – cyptus 2012-07-22 12:29:11

+0

来确定每当用户添加新项目时,我都可以使用文件系统监视器来观看快速启动项目的文件夹。如果注册表内容在时间上发生变化,这可能是完美的。但我不这么认为。我也可以刷新所有项目(通过itemtext)当按下热键时执行任何项目,所以我会始终正确的顺序。另一种解决方案是在程序开始时实时加载所有项目,我认为快速项目不会经常移动(并且通过添加一个新项目我有一个事件) – cyptus 2012-07-22 12:30:22