是否有一些C#代码用于从在资源管理器搜索框中输入的搜索词创建保存的查询文件(. search ),就像ISearchQueryHelper将搜索项扩展到Windows的OLEDB查询一样?还是将OLEDB查询转换为..search ms文件的代码?我想在资源管理器中显示来自Windows的结果--我可以在网格中显示OleDb查询结果,但是我更喜欢使用资源管理器。
发布于 2017-06-30 00:44:42
事实证明,创建保存的搜索,然后运行它,并不是启动显示过滤结果的Windows/ filtered窗口的最简单方法,因为保存的搜索XML通过编程方式生成非常复杂。将搜索框左侧的框内容作为URL并将其提供给Internet,将得到正确的结果。
输入搜索字符串后
name:~ "*[*2602_Australia_Australian Capital Territory_Downer*].*" OR name:~ "*[*2602_Australia_Australian Capital Territory_O'Connor*].*"
在文件夹中
C:\Users\Simon\Pictures\iPhoneSample
显示了预期的结果。单击显示“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提供给Internet (iexplore.exe而不是Explorer.exe)将显示一个新的Windows/iexplore.exe窗口,其中包含预期的搜索结果。用于执行此操作的一些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);
https://stackoverflow.com/questions/44820200
复制相似问题