2017-06-29 54 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);