2017-06-29 136 views
0

中的术语创建保存的搜索(.search-ms)是否存在一些C#代码,用于按照与ISearchQueryHelper相同的方式在资源管理器搜索框中输入的搜索术语中创建保存的查询文件(.search-ms)将搜索条件扩展到Windows Search API的OLEDB查询中?或者将OLEDB查询转换为.search-ms文件的代码?我想在资源管理器中显示Windows搜索的结果 - 我可以在网格中显示OleDb查询结果,但更愿意使用资源管理器。从资源管理器搜索框

回答

0

原来,创建保存的搜索并运行它并不是启动显示过滤结果的Windows /文件资源管理器窗口的最简单方法,因为保存的搜索XML非常复杂以编程方式生成。将搜索框左侧的框内容作为URL并将其提供给Internet Explorer将提供正确的结果。

文件夹

C:\Users\Simon\Pictures\iPhoneSample 

在输入搜索字符串

name:~ "*[*2602_Australia_Australian Capital Territory_Downer*].*" OR name:~ "*[*2602_Australia_Australian Capital Territory_O'Connor*].*" 

后显示预期的结果。点击显示“搜索中iPhoneSample结果”左手框显示:

search-ms:displayname=Search%20Results%20in%20iPhoneSample&crumb=name%3A~"*[*2602_Australia_Australian%20Capital%20Territory_Downer*].*"%20OR%20name%3A~"*[*2602_Australia_Australian%20Capital%20Territory_O'Connor*].*"&crumb=location:C%3A%5CUsers%5CSimon%5CPictures%5CiPhoneSample 

提供此作为URL来互联网浏览器(iexplore.exe的,而不是Explorer.exe中)显示了一个新的Windows /文件,浏览器窗口预期的搜索结果。这样做的某些C#代码如下所示:

/// <summary> 
    /// Show Windows Explorer in new window with results filtered by search string 
    /// </summary> 
    /// <param name="sCommonFolder">Folder to search in </param> 
    /// <param name="sSearchString">search string</param> 
    private void ShowSearchResultsInExplorer(string sCommonFolder, string sSearchString) 
    { 
     // sCmd = "search-ms:displayname=Search%20Results%20in%20iPhoneSample&crumb=name" & _ 
     //"%3A~""*[*2602_Australia_Australian%20Capital%20Territory_Downer*].*""%20OR%20name%3A~""" & _ 
     //"*[*2602_Australia_Australian%20Capital%20Territory_O'Connor*].*""&crumb=location:C%3A%5CUsers%5CSimon%5CPictures%5CiPhoneSample" 

     string sFilter = "search-ms:displayname="; 
     sFilter += Uri.EscapeDataString("Tagged files in " + sCommonFolder); 
     sFilter += @"&crumb=" +sSearchString; 
     sFilter += @"&crumb=location:" + Uri.EscapeDataString(sCommonFolder); 

     Process.Start("IExplore.exe", sFilter); 

    } 

显示搜索结果之后,窗口需要显示后续搜索结果之前被关闭,否则随后的结果不显示。这可以用下面的代码来完成:

SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); 

     foreach (SHDocVw.InternetExplorer window in shellWindows) 
     { 
      Console.Write ("Window " + window.LocationName + " " + window.LocationURL + " " + window.Name + " " + window.HWND + "\r\n"); 
      if (window.LocationName.Contains("Tagged files")) 
      {     
       SendMessage((IntPtr)window.HWND, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
      } 
     } 

此代码需要一些声明:

using System.Web; 
using System.Runtime.InteropServices; 
.... 
static uint WM_CLOSE = 0x10; 
... 
[DllImport("user32.dll")] 
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);