将其放在一起
当我着手创建该加载项时,目标是当用户选择 Visual Studio 编辑器中的某文本时仍然可以执行查询,而且我希望最初能找到一些 Visual Studio 可扩展性文本选定事件。虽然 TextSelection 可扩展性接口可返回当前选定的文本,但可扩展性并不提供文本选定更改事件。这是一个令人遗憾的退步。唯一的解决方案是轮询,但会再度产生 Visual Studio 响应性问题。轮询本质上是一种代价高昂的操作,因为您会在不必要的时候结束轮询。因此需要建立仔细的安全措施,以防止过度轮询。
一种方法是为您的用户控件添加计时器,并设置为每两秒滴答一次。也可以为“选项”对话框页面添加几个较慢的计时器刷新设置。计时器的 Tick 事件处理程序仅调用私有 ExecuteQuery 方法,设置查询和初始化次级工作线程处理就在此进行,如图 7 所示。为强调该方法的目的,一个很妙的主意是,将其命名为与 Windows Desktop Search SDK 的方法名称 (SearchDesktopClass.ExecuteQuery) 相匹配的名称。
当 ExecuteQuery 运行时,首先进行的操作就是将私有处理字段设置为“true”,并禁用轮询计时器。然后检索 Visual Studio 活动文档,并检索其带有 Text 属性的 TextSelection(如果有)。该属性会返回编辑器中当前选定的文本。
将最后一次执行的选定保存在私有字段中。检索 TextSelection.Text 后,请检查当前选定文本是否与上次文本查询有所不同。如果相同,就不必重新执行,只需退出该方法即可。
您还应按照 选项对话框页面中的配置,检查选定文本是否满足最低选定文本要求。选定的文本至少应包含三个执行查询的字符,即针对用户选择的性能保障,例如,如果只输入一个字母 A,Windows 桌面搜索将返回数千个条目。
如果一切正常,将使用要搜索的文本设置查询工作线程(以前定义的 WDSQueryWorker 类),并且会调用它的 DoWork 方法。ExecuteQuery 方法结束时,计时器将重新启动(如果事先是运行的)并且处理字段将重新设置为“false”。结果列表视图将被清除,更新状态也将被更改,从而显示“Searching…”。
查询工作线程的 DoWork 方法将设置一个事件,用于执行一次查询。当然,所有这些工作都可以在次级线程上执行。当查询完成时,该方法将回调到主线程。回调委托恰好支持 ToolWindowUserControl。其中的 QueryCompleted 方法将只调用 DisplayResults 来更新结果列表视图。如果查询失败,它还会调用 ToolWindowUserControl 的 QueryError 方法。根据“选项”对话框页面中的配置,QueryError 可显示错误消息或无提示地忽略错误。
DisplayResults 方法将收到一个 _Recordset 参数。如果重新调用,Windows Desktop Search SDK ExecuteQuery 方法就会返回该参数。DisplayResults 将遍历结果,每次提取一行。它可以根据预定义的一组查询字段检索列值,并更新相应的列表视图列。它还可以根据 PerceivedType 列对项目进行分组,Windows 桌面搜索可依此识别项目类型。列表视图分组是 .NET Framework 2.0 的新功能,无法在 Windows XP 之前的系统上运行。
除针对最小查询字符串长度具有保障外,您还可以限制显示的结果数,例如让每个类别只显示前 100 项。您可以将该选项更改为 0 以查看整个结果集。通过列表视图结果的合理的端,UI 更新处理几乎可以瞬间发生,这极大改善了 Visual Studio 的响应性。研究一下结果选项,看看哪种最适合您。
存在潜在改进可能性的一个方面是,检查 Windows 桌面搜索是否支持在查询级别上限制结果集。即,如果将“显示首批结果”选项实现从调整显示结果转为调整实际查询范围,就可以加速该进程。
安装和部署
Visual Studio 2005 引入了一个新的基于 .addin 配置文件的免注册部署方案。这使加载项的安装就像将程序集复制到指定文件夹以及重启 Visual Studio 一样简单。以下是 Windows 桌面搜索加载项的手动安装步骤:
•将 WDSAddinBinaries 文件夹的内容复制到 \Program Files\WDSAddin 文件夹中。如果您要使用其他文件夹,则手动更新 WDSAddin.addin 中的文件路径引用。
•将 WDSAddin.addin 文件复制到 \My Documents\Visual Studio 2005\Addins 文件夹中。
•确保 Msvcp71.dll 的副本也位于 Windows 桌面搜索安装文件夹中,并位于 Windows 路径中的某个位置。否则只需将文件从 Windows 桌面搜索安装文件夹复制到 \Windows\System32 中即可。
如果您计划调试 Windows 桌面搜索加载项,请关闭 Visual Studio,并至少运行一次代码下载中包含的 ToolWindow.reg 文件。它包含一个针对 Visual Studio 2005 加载项工具窗口状态持久性问题的解决方案。否则只需跳过该步骤即可。
小结
Windows Desktop Search SDK 所做的工作及其应用相当简单,而且我所描述的加载项也不太复杂。而两者组合起来却非常有用。该加载项与 Visual Studio Dynamic Help 类似,但前者还具有扫描整个计算机的功能,而不仅仅是预定义的一组帮助文件。
Sergey Mishkovskiy 是 OpenSpan Inc. 的一名高级软件开发人员。闲暇之余,他会玩 Xbox、阅读,并且负责一个流行的免费 Visual Studio 加载项(名为 DPack)方面的工作。有关 DPack 的详细信息,请访问 www.usysware.com/dpack(英文)。您可以发送电子邮件到 sergey@usysware.com 与 Sergey 联系。

