Windows-Suche mit WinRT

Um die Windows-Suche über die WinRT-Library verwenden zu können, ist zunächst eine Referenz auf eben jene notwendig. In einer Windows-Store Anwendung ist dies das geringere Problem, in WPF- und WinForms-Anwendungen hingegen sieht dies schon wieder anders aus. Denn bei Letzteren steht diese Assembly – selbst bei der Verwendung des neuesten Studios auf Windows 8 – nicht in der Liste der zur Verfügung stehenden Assemblys. Aber wie kann man es auch anders erwarten. Natürlich gibt es auch hierfür wieder einen Trick.

Um die WinRT-Library auch in diesen Anwendungen nutzen zu können, müssen lediglich folgende Schritte durchgeführt werden:

  1. Visual Studio nach Anlegen des Projektes schließen. 
  2. Die jeweilige *.csproj-Datei im Editor bearbeiten.
  3. Das Tag „TargetPlatformVersion“ suchen und hier den Wert „8.0“ bzw. ab Windows Blue auch „8.1“ einfügen.
  4. Die Änderung speichern und das Projekt wieder im Studio öffnen.

Nun ist es möglich, die WinRT-Library wie normale .NET-Assemblys zu referenzieren. Allerdings sollte man sich darüber im Klaren sein, dass die resultierende Anwendung auch nur für die entsprechenden Systeme ausgelegt ist und somit nicht mehr unter Windows 7 oder älteren Windowsversionen funktioniert. 

Im nächsten Schritt können wir nun eine Methode implementieren, welche uns die Windows-Suche zur Verfügung stellt. Da wir nun ohnehin an Win8+ gebunden sind, kann und sollte nun auch .NET 4.5 verwendet werden. Um die Windows-Suche verwenden zu können, sind zunächst folgende Using-Directives notwendig:

using Windows.Storage;
using Windows.Storage.Search;

Anschließend können wir unsere Methode in einer Klasse nach Wahl implementieren (der Modifier sollte nicht vergessen werden, den habe ich hier im Beispiel außen vor gelassen):

async Task<IReadOnlyList<StorageFile>> SearchAsync(string filter, string folder = "C:\\")
{
    var documents = KnownFolders.DocumentsLibary; 
    var queryOptions = new QueryOptions
            {
                FolderDepth = FolderDepth.Deep, 
                IndexerOption.UseIndexerWhenAvailable, 
                UserSearchFilter = string.Format("'{0}' folder:{1}", filter, folder)
            };     

    var query = documents.CreateFileQueryWithOptions(queryOptions);
    return await query.GetFilesAsync();
}

Und schon können wir über diese Methode die Windows-Suche verwenden. Wahlweise könnte das ganze natürlich auch synchron verwendet und implementiert werden.