65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (3投票s)

2007年11月1日

CPOL

2分钟阅读

viewsIcon

37872

downloadIcon

457

本文解释了如何在 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 - 高级查询语法)非常不同。但搜索团队做了出色的工作,让我们的生活更轻松。CSearchManagerISeachQueryHelper - 它们将 AQS 转换为 SQL,甚至为我们提供合适的连接 string

Using the Code

首先,我们将不得不创建 CSeachManager

CSearchManager cManager = new CSearchManagerClass(); 

然后,当您在查询时,您将创建新的 ISearchQueryHelper 以帮助您进行翻译和查询 strings

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 日:初始发布
© . All rights reserved.