сделать поиск по выделению окон в С#
Вопрос
Можно ли через С# на самом деле выполнить поиск в Windows (тот, который вы найдете в Vista из меню с подсветкой (например, вы пишете «fire» и получаете «firefox»)).
Спасибо :)
Решение
Да, это возможно с помощью API Windows Desktop Search (WDS).Вам понадобится SDK, который даже предоставляет сборку .Net, если я правильно помню.Тогда посмотрите документация чтобы узнать, как запросить индекс WDS.Это довольно просто, вот пример C#, который они предоставляют:
OleDbConnection conn = new OleDbConnection(
"Data Source=(local);Initial Catalog=Search.CollatorDSO;Integrated Security=SSPI;User ID=<username>;Password=<password>");
OleDbDataReader rdr = null;
conn.Open();
OleDbCommand cmd = new OleDbCommand("SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX", conn);
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0]);
}
rdr.Close();
conn.Close();
Когда я некоторое время назад использовал это в проекте, строка запроса, которую я использовал, была построена примерно так:
CSearchManager SearchManager = new CSearchManager();
CSearchCatalogManager CatalogManager = SearchManager.GetCatalog("SystemIndex");
CSearchQueryHelper QueryHelper = CatalogManager.GetQueryHelper();
string connection_string = QueryHelper.ConnectionString;
Затем выполните простой поиск файлов:
QueryHelper.QueryWhereRestrictions = "AND scope='file:'";
QueryHelper.QuerySorting = "System.ItemNameDisplay ASC";
string sqlQuery = QueryHelper.GenerateSQLFromUserQuery(Filename);
Из документации вы можете узнать, как создавать запросы, которые дают нужные вам результаты.
Теперь небольшое замечание.Мне удалось создать клон Vista Start Search, однако я сделал это, сначала просканировав файлы ссылок в тех местах, где Vista хранит ссылки меню «Пуск» (%appdata%\Microsoft\Windows\Start Menu & C:\ProgramData\Microsoft\Windows \Start Menu), а затем асинхронно загружает результаты WDS в фоновом режиме, что лучше воспроизводит поведение начала поиска, чем полагаться исключительно на WDS.
Другие советы
Поиск Windows использует индекс для получения результатов путем запроса индекса по мере обновления текста в поле поиска.Чтобы это работало, движок должен быть способен очень быстро возвращать результаты, поэтому хорошей идеей является коллекция, которая очень эффективна для поиска.
Затем вы запросите хеш-таблицу, когда текст в поле поиска изменится.