如何从 WPF 应用程序使用 Windows Vista 搜索 API





3.00/5 (3投票s)
本文解释了如何在 WPF 应用程序中使用 Windows Vista 搜索提供程序。它结合了数据绑定、查询提供程序和其他有用的技术,这些技术在 Windows Vista 和 Windows Presentation Foundation 中被引入。
引言
Windows Vista 提供的另一项重要服务是其集成的搜索。我们可以在 WPF 应用程序中使用它吗?当然可以。这就是你将如何做到这一点。
背景
首先,您需要在 Windows SDK 中找到 Windows Search
API 库。找到 SearchAPI.tlb 并使用 tlbimp 工具处理它以创建托管程序集进行引用。您将获得一个名为 SeachAPILib.dll 的文件。你需要这个文件。为了使用它,请参考 Windows Search API 3.0 的 MSDN 文档。实际上,使用 Search
API 与使用数据库查询没有太大区别。但是,这在核心方面并不那么简单。实际上,Windows 搜索的语法(AQS - 高级查询语法)非常不同。但搜索团队做了出色的工作,让我们的生活更轻松。CSearchManager
和 ISeachQueryHelper
- 它们将 AQS 转换为 SQL,甚至为我们提供合适的连接 string
。
Using the Code
首先,我们将不得不创建 CSeachManager
CSearchManager cManager = new CSearchManagerClass();
然后,当您在查询时,您将创建新的 ISearchQueryHelper
以帮助您进行翻译和查询 string
s
ISearchQueryHelper cHelper = cManager.GetCatalog("SYSTEMINDEX").GetQueryHelper();
cHelper.QuerySelectColumns = "\"System.ItemNameDisplay\"";
做得好,现在。用好的 OleDB 提供程序询问 Vista
using (cConnection = new OleDbConnection(cHelper.ConnectionString))
{
cConnection.Open();
using (OleDbCommand cmd = new OleDbCommand(
cHelper.GenerateSQLFromUserQuery(SearchString),cConnection))
{
if (cConnection.State == ConnectionState.Open)
{
using (OleDbDataReader reader = cmd.ExecuteReader())
{
m_results.Clear();
while (!reader.IsClosed && reader.Read())
{
m_results.Add(reader[0].ToString());
}
reader.Close();
}
}
}
cConnection.Close();
}
太棒了。让我们通过创建一个 DependencyObject
将其移动到 WPF 中,该对象为我们提供了搜索所需的一切 - 搜索字符串和结果数组
public static readonly DependencyProperty SearchTextProperty =
DependencyProperty.Register
("SearchText", typeof(string), typeof(VistaSearchProviderHelper),
new UIPropertyMetadata(default(string),
new PropertyChangedCallback(OnSearchTextChanged)));
static void OnSearchTextChanged
(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
//change
ToAbortFlag = IsWorkingFlag;
if (workerCallback == null) workerCallback = new WaitCallback(doSearch);
searchObjState.SearchString = e.NewValue.ToString();
//if (searchObjState.SearchString.Length > 2)
{
workerCallback.BeginInvoke(searchObjState, null, null);
}
}
public string SearchText
{
get { return GetValue(SearchTextProperty).ToString(); }
set { SetValue(SearchTextProperty, value); }
}
static ThreadSafeObservableCollection<string> m_results;
public ReadOnlyObservableCollection<string> Results
{
get { return new ReadOnlyObservableCollection<string>(m_results); }
}
此代码使用一个名为 ThreadSafeObservableCollection
的自定义类,之前在我的博客中介绍过。
我们现在唯一应该做的事情是将输入和输出绑定到 XAML 演示文稿
<StackPanel FocusManager.FocusedElement="{Binding ElementName=searchStr}">
<StackPanel.DataContext>
<ObjectDataProvider ObjectType="l:VistaSearchProviderHelper"/>
</StackPanel.DataContext>
<TextBox Name="searchStr" Text="{Binding Path=SearchText,
UpdateSourceTrigger=PropertyChanged }" FontSize="30"/>
<ListBox ItemsSource="{Binding Path=Results}" />
</StackPanel>
结论
现在我们可以从自定义 WPF 应用程序中搜索我们的 Windows Vista。这当然不是最终的应用程序。要使其完美运行还有很长的路要走,但这只是如何做它的开始。
历史
- 2007 年 11 月 1 日:初始发布