Auflisten von Geräten
Mit den Windows.Devices.Enumeration-APIs können Sie Geräte finden, die intern mit dem System verbunden, extern verbunden oder über Drahtlos- oder Netzwerkprotokolle erkannt werden können.
Beispiele
Die einfachste Möglichkeit zum Aufzählen aller verfügbaren Geräte besteht darin, eine Momentaufnahme mit dem Befehl "FindAllAsync " zu erstellen (weiter unten in einem Abschnitt erläutert).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Ein komplexeres Beispiel für die Windows.Devices.Enumeration-APIs finden Sie im Beispiel "Device-Enumeration und -Kopplung".
Enumerations-APIs
Mit dem Windows.Devices.Enumeration-Namespace können Sie Geräte finden, die intern mit dem System verbunden, extern verbunden oder über Drahtlos- oder Netzwerkprotokolle erkannt werden können. Zu den features, die von diesen APIs unterstützt werden, gehören:
- Suchen eines Geräts, mit dem eine Verbindung mit Ihrer Anwendung hergestellt werden soll.
- Abrufen von Informationen zu Geräten, die mit dem System verbunden oder auffindbar sind.
- Erhalten Sie eine App Benachrichtigungen, wenn Geräte hinzugefügt, verbunden, getrennt, Onlinestatus geändert oder andere Eigenschaften geändert werden.
- Erhalten Sie Hintergrundtrigger, wenn Geräte eine Verbindung herstellen, trennen, den Onlinestatus ändern oder andere Eigenschaften ändern.
Diese APIs können Geräte über eines der folgenden Protokolle und Busse auflisten, sofern das einzelne Gerät und das System, auf dem die App ausgeführt wird, diese Technologie unterstützen. Dies ist keine vollständige Liste, und andere Protokolle können von einem bestimmten Gerät unterstützt werden.
- Physisch verbundene Busse. Dazu gehören PCI und USB. So kann beispielsweise alles, was sie im Geräte-Manager sehen können.
- UPnP
- Digital Living Network Alliance (DLNA)
- Ermittlung und Start (DIAL)
- DNS Service Discovery (DNS-SD)
- Webdienste auf Geräten (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- Point of Service
In vielen Fällen müssen Sie sich keine Gedanken über die Verwendung der Enumerations-APIs machen. Dies liegt daran, dass viele APIs, die Geräte verwenden, automatisch das entsprechende Standardgerät auswählen oder eine optimierte Enumerations-API bereitstellen. Beispielsweise verwendet MediaElement automatisch das Standardmäßige Audiorenderergerät. Solange Ihre App das Standardgerät verwenden kann, ist es nicht erforderlich, die Enumerations-APIs in Ihrer Anwendung zu verwenden. Die Enumerations-APIs bieten eine allgemeine und flexible Möglichkeit, um verfügbare Geräte zu ermitteln und zu verbinden. Dieses Thema enthält Informationen zum Aufzählen von Geräten und beschreibt die vier gängigen Methoden zum Aufzählen von Geräten.
- Verwenden der DevicePicker-Benutzeroberfläche
- Aufzählen einer Momentaufnahme von Geräten, die derzeit vom System erkannt werden können
- Aufzählen von Geräten, die zurzeit auffindbar sind und auf Änderungen achten
- Aufzählen von geräten, die zurzeit auffindbar sind und auf Änderungen in einer Hintergrundaufgabe achten
DeviceInformation-Objekte
Wenn Sie mit den Enumerations-APIs arbeiten, müssen Sie häufig DeviceInformation-Objekte verwenden. Diese Objekte enthalten die meisten verfügbaren Informationen zum Gerät. In der folgenden Tabelle werden einige der DeviceInformation-Eigenschaften erläutert, die Sie interessieren werden. Eine vollständige Liste finden Sie auf der Referenzseite für DeviceInformation.
Eigenschaft | Kommentare |
---|---|
DeviceInformation.Id | Dies ist der eindeutige Bezeichner des Geräts und wird als Zeichenfolgenvariable bereitgestellt. In den meisten Fällen ist dies ein undurchsichtiger Wert, den Sie einfach von einer Methode an eine andere übergeben, um das spezifische Gerät anzugeben, an dem Sie interessiert sind. Sie können diese Eigenschaft und die DeviceInformation.Kind-Eigenschaft auch verwenden, nachdem Sie die App geschlossen und erneut geöffnet haben. Dadurch wird sichergestellt, dass Sie dasselbe DeviceInformation-Objekt wiederherstellen und wiederverwenden können. |
DeviceInformation.Kind | Dies gibt die Art des Geräteobjekts an, das durch das DeviceInformation -Objekt dargestellt wird. Dies ist nicht die Gerätekategorie oder gerätetyp. Ein einzelnes Gerät kann durch verschiedene DeviceInformation-Objekte unterschiedlicher Art dargestellt werden. Die möglichen Werte für diese Eigenschaft werden sowohl in DeviceInformationKind als auch in der Beziehung zueinander aufgeführt. |
DeviceInformation.Properties | Dieser Eigenschaftenbehälter enthält Informationen, die für das DeviceInformation-Objekt angefordert werden. Auf die am häufigsten verwendeten Eigenschaften wird einfach als Eigenschaften des DeviceInformation-Objekts verwiesen, z. B. mit DeviceInformation.Name. Weitere Informationen finden Sie unter Geräteinformationseigenschaften. |
DevicePicker-Benutzeroberfläche
DevicePicker ist ein Von Windows bereitgestelltes Steuerelement, das eine kleine Benutzeroberfläche erstellt, mit der der Benutzer ein Gerät aus einer Liste auswählen kann. Sie kann auf verschiedene Arten angepasst werden, z. B.:
- Steuern Sie Geräte, die auf der Benutzeroberfläche angezeigt werden, indem Sie eine SupportedDeviceSelectors, eine SupportedDeviceClasses oder beides zum DevicePicker.Filter hinzufügen. In den meisten Fällen müssen Sie nur einen Selektor oder eine Klasse hinzufügen, aber wenn Sie mehrere benötigen, können Sie mehrere hinzufügen. Wenn Sie mehrere Selektoren oder Klassen hinzufügen, werden sie mit einer OR-Logikfunktion zusammengebindet.
- Geben Sie die Eigenschaften an, die Sie für die Geräte abrufen möchten. Dazu können Sie Eigenschaften zu DevicePicker.RequestedProperties hinzufügen.
- Ändern sie die Darstellung von DevicePicker mithilfe der Darstellung.
- Geben Sie die Größe und Position des DevicePicker an, wenn sie angezeigt wird.
Während das DevicePicker-Element angezeigt wird, wird der Inhalt der Benutzeroberfläche automatisch aktualisiert, wenn Geräte hinzugefügt, entfernt oder aktualisiert werden.
Hinweis: Sie können deviceInformationKind nicht mithilfe des DevicePicker angeben. Wenn Sie Geräte eines bestimmten DeviceInformationKind-Geräts verwenden möchten, müssen Sie ein DeviceWatcher erstellen und eine eigene Benutzeroberfläche bereitstellen.
Das Umwandeln von Medieninhalten und DIAL stellt auch eigene Auswahlprogramme bereit, wenn Sie sie verwenden möchten. Sie sind CastingDevicePicker bzw. DialDevicePicker.
Auflisten einer Momentaufnahme von Geräten
In einigen Szenarien ist devicePicker nicht für Ihre Bedürfnisse geeignet, und Sie benötigen etwas flexibler. Vielleicht möchten Sie eine eigene Benutzeroberfläche erstellen oder Geräte auflisten, ohne dem Benutzer eine Benutzeroberfläche anzuzeigen. In diesen Situationen können Sie eine Momentaufnahme von Geräten aufzählen. Dies umfasst das Durchsuchen der Geräte, die derzeit mit dem System verbunden oder gekoppelt sind. Sie müssen jedoch beachten, dass diese Methode nur eine Momentaufnahme der verfügbaren Geräte betrachtet, sodass Sie nach der Aufzählung der Liste keine Geräte finden können, die eine Verbindung herstellen. Sie werden auch nicht benachrichtigt, wenn ein Gerät aktualisiert oder entfernt wird. Ein weiterer potenzieller Nachteil ist, dass diese Methode alle Ergebnisse zurückhält, bis die gesamte Enumeration abgeschlossen ist. Aus diesem Grund sollten Sie diese Methode nicht verwenden, wenn Sie an AssociationEndpoint-, AssociationEndpointContainer- oder AssociationEndpointService-Objekten interessiert sind, da sie über ein Netzwerk- oder Drahtlosprotokoll gefunden werden. Dies kann bis zu 30 Sekunden dauern. In diesem Szenario sollten Sie ein DeviceWatcher-Objekt verwenden, um die möglichen Geräte auflisten zu können.
Verwenden Sie die FindAllAsync-Methode , um eine Momentaufnahme von Geräten auflisten zu können. Diese Methode wartet, bis der gesamte Enumerationsprozess abgeschlossen ist, und gibt alle Ergebnisse als ein DeviceInformationCollection -Objekt zurück. Diese Methode wird auch überladen, um Ihnen mehrere Optionen zum Filtern Ihrer Ergebnisse und das Einschränken auf die Geräte bereitzustellen, an denen Sie interessiert sind. Dazu können Sie eine DeviceClass bereitstellen oder eine Geräteauswahl übergeben. Die Geräteauswahl ist eine AQS-Zeichenfolge (Advanced Query Syntax), die die Geräte angibt, die Sie aufzählen möchten. Weitere Informationen finden Sie unter Erstellen einer Geräteauswahl.
Zusätzlich zum Einschränken der Ergebnisse können Sie auch die Eigenschaften angeben, die Sie für die Geräte abrufen möchten. Wenn Sie dies tun, stehen die angegebenen Eigenschaften im Eigenschaftenbehälter für jedes der in der Auflistung zurückgegebenen DeviceInformation-Objekte zur Verfügung. Es ist wichtig zu beachten, dass nicht alle Eigenschaften für alle Gerätetypen verfügbar sind. Informationen dazu, welche Eigenschaften für welche Gerätetypen verfügbar sind, finden Sie unter Geräteinformationseigenschaften.
Aufzählen und Überwachen von Geräten
Eine leistungsfähigere und flexiblere Methode für die Enumeration von Geräten ist die Erstellung eines DeviceWatcher. Diese Option bietet die größte Flexibilität beim Aufzählen von Geräten. Sie können Geräte aufzählen, die derzeit vorhanden sind, und auch Benachrichtigungen empfangen, wenn Geräte, die Ihrer Geräteauswahl entsprechen, hinzugefügt, entfernt oder Eigenschaften geändert werden. Wenn Sie ein DeviceWatcher-Objekt erstellen, stellen Sie eine Geräteauswahl bereit. Weitere Informationen zu Geräteauswahlen finden Sie unter Erstellen einer Geräteauswahl. Nach dem Erstellen des Watchers erhalten Sie die folgenden Benachrichtigungen für jedes Gerät, das Ihren angegebenen Kriterien entspricht.
- Benachrichtigung hinzufügen, wenn ein neues Gerät hinzugefügt wird.
- Aktualisieren Sie die Benachrichtigung, wenn eine eigenschaft, an der Sie interessiert sind, geändert wird.
- Entfernen Sie die Benachrichtigung, wenn ein Gerät nicht mehr verfügbar ist oder nicht mehr mit Ihrem Filter übereinstimmt.
In den meisten Fällen, in denen Sie ein DeviceWatcher verwenden, verwalten Sie eine Liste von Geräten und fügen sie hinzu, entfernen Sie Elemente daraus, oder aktualisieren Sie Elemente, während Ihr Watcher Updates von den Geräten empfängt, die Sie beobachten. Wenn Sie eine Aktualisierungsbenachrichtigung erhalten, stehen die aktualisierten Informationen als DeviceInformationUpdate-Objekt zur Verfügung. Um Ihre Geräteliste zu aktualisieren, suchen Sie zuerst die entsprechende DeviceInformation , die geändert wurde. Rufen Sie dann die Update-Methode für dieses Objekt auf, und stellen Sie das DeviceInformationUpdate-Objekt bereit. Dies ist eine Komfortfunktion, die Ihr DeviceInformation-Objekt automatisch aktualisiert.
Da ein DeviceWatcher Benachrichtigungen sendet, wenn Geräte eingehen und sich ändern, sollten Sie diese Methode zum Aufzählen von Geräten verwenden, wenn Sie an AssociationEndpoint, AssociationEndpointContainer oder AssociationEndpointService-Objekten interessiert sind, da sie über Netzwerk- oder Drahtlosprotokolle aufgezählt werden.
Verwenden Sie zum Erstellen einer DeviceWatcher-Methode eine der CreateWatcher-Methoden. Diese Methoden sind überladen, damit Sie die geräte angeben können, an denen Sie interessiert sind. Dazu können Sie eine DeviceClass bereitstellen oder eine Geräteauswahl übergeben. Die Geräteauswahl ist eine AQS-Zeichenfolge, die die Geräte angibt, die Sie auflisten möchten. Weitere Informationen finden Sie unter Erstellen einer Geräteauswahl. Sie können auch die Eigenschaften angeben, die Sie für die Geräte abrufen möchten und an denen Sie interessiert sind. Wenn Sie dies tun, stehen die angegebenen Eigenschaften im Eigenschaftenbehälter für jedes der in der Auflistung zurückgegebenen DeviceInformation-Objekte zur Verfügung. Es ist wichtig zu beachten, dass nicht alle Eigenschaften für alle Gerätetypen verfügbar sind. Informationen dazu, welche Eigenschaften für welche Gerätetypen verfügbar sind, finden Sie unter Geräteinformationseigenschaften
Geräte als Hintergrundaufgabe ansehen
Das Überwachen von Geräten als Hintergrundaufgabe ähnelt dem Erstellen eines DeviceWatcher wie oben beschrieben. Tatsächlich müssen Sie weiterhin ein normales DeviceWatcher-Objekt erstellen, wie im vorherigen Abschnitt beschrieben. Nachdem Sie es erstellt haben, rufen Sie GetBackgroundTrigger anstelle von DeviceWatcher.Start auf. Wenn Sie GetBackgroundTrigger aufrufen, müssen Sie angeben, an welchen der Benachrichtigungen Sie interessiert sind: Hinzufügen, Entfernen oder Aktualisieren. Sie können keine Aktualisierung oder Entfernung anfordern, ohne auch Hinzufügen anzufordern. Nachdem Sie den Trigger registriert haben, wird der DeviceWatcher sofort im Hintergrund ausgeführt. Ab diesem Zeitpunkt wird die Hintergrundaufgabe ausgelöst, sobald sie eine neue Benachrichtigung für Ihre Anwendung empfängt, die Ihren Kriterien entspricht, und sie stellt die neuesten Änderungen bereit, seit sie ihre Anwendung zuletzt ausgelöst hat.
Wichtig: Wenn ein DeviceWatcherTrigger die Anwendung zum ersten Mal auslöst, erreicht der Watcher den EnumerationCompleted-Zustand. Dies bedeutet, dass sie alle anfänglichen Ergebnisse enthält. Jedes mal, wenn sie Ihre Anwendung auslöst, enthält sie nur die Benachrichtigungen zum Hinzufügen, Aktualisieren und Entfernen, die seit dem letzten Auslöser aufgetreten sind. Dies unterscheidet sich geringfügig von einem Vordergrund-DeviceWatcher-Objekt, da die anfänglichen Ergebnisse nicht einzeln vorliegen und nur in einem Bundle bereitgestellt werden, nachdem die EnumerationCompleted erreicht wurde.
Einige drahtlose Protokolle verhalten sich anders, wenn sie im Hintergrund im Hintergrund im Vergleich zum Vordergrund gescannt werden oder das Scannen im Hintergrund überhaupt nicht unterstützt wird. Es gibt drei Möglichkeiten im Zusammenhang mit dem Scannen im Hintergrund. In der folgenden Tabelle sind die Möglichkeiten und auswirkungen aufgeführt, die sich auf Ihre Anwendung auswirken können. Bluetooth und WI-Fi Direct unterstützen z. B. keine Hintergrundscans, sodass sie durch Erweiterung keine DeviceWatcherTrigger unterstützen.
Behavior | Auswirkung |
---|---|
Gleiches Verhalten im Hintergrund | Keine |
Nur passive Scans im Hintergrund möglich | Das Gerät kann länger auffinden, während auf einen passiven Scan gewartet wird. |
Hintergrundscans werden nicht unterstützt | Vom DeviceWatcherTrigger werden keine Geräte erkannt, und es werden keine Updates gemeldet. |
Wenn Ihr DeviceWatcherTrigger ein Protokoll enthält, das das Scannen nicht als Hintergrundaufgabe unterstützt, funktioniert der Trigger weiterhin. Sie können jedoch keine Updates oder Ergebnisse über dieses Protokoll abrufen. Die Updates für andere Protokolle oder Geräte werden weiterhin normal erkannt.
Verwenden von DeviceInformationKind
In den meisten Szenarien müssen Sie sich nicht um das DeviceInformationKind-Objekt eines DeviceInformation-Objekts kümmern. Dies liegt daran, dass die von Der verwendeten Geräte-API zurückgegebene Geräteauswahl häufig garantiert, dass Sie die richtigen Arten von Geräteobjekten erhalten, die mit ihrer API verwendet werden. In einigen Szenarien möchten Sie jedoch deviceInformation für Geräte abrufen, es gibt jedoch keine entsprechende Geräte-API, um eine Geräteauswahl bereitzustellen. In diesen Fällen müssen Sie einen eigenen Selektor erstellen. Webdienste auf Geräten verfügen z. B. nicht über eine dedizierte API, Sie können diese Geräte aber ermitteln und Informationen über sie mithilfe der Windows.Devices.Enumeration-APIs abrufen und diese dann mithilfe der Socket-APIs verwenden.
Wenn Sie eine eigene Geräteauswahl zum Aufzählen von Geräteobjekten erstellen, ist DeviceInformationKind wichtig für Sie zu verstehen. Alle möglichen Arten sowie ihre Beziehung zueinander werden auf der Referenzseite für DeviceInformationKind beschrieben. Eine der häufigsten Verwendungsmöglichkeiten von DeviceInformationKind besteht darin, anzugeben, nach welcher Art von Geräten Sie suchen, wenn Sie eine Abfrage in Verbindung mit einer Geräteauswahl senden. Dadurch wird sichergestellt, dass Sie nur Geräte aufzählen, die mit dem bereitgestellten DeviceInformationKind übereinstimmen. Beispielsweise könnten Sie ein DeviceInterface-Objekt finden und dann eine Abfrage ausführen, um die Informationen für das übergeordnete Device-Objekt abzurufen. Dieses übergeordnete Objekt kann zusätzliche Informationen enthalten.
Beachten Sie, dass die im Eigenschaftenbehälter für ein DeviceInformation-Objekt verfügbaren Eigenschaften je nach DeviceInformationKind des Geräts variieren. Bestimmte Eigenschaften sind nur für bestimmte Arten verfügbar. Weitere Informationen dazu, welche Eigenschaften für welche Arten verfügbar sind, finden Sie unter Geräteinformationseigenschaften. Daher erhalten Sie im obigen Beispiel durch die Suche nach dem übergeordneten Gerät Zugriff auf weitere Informationen, die nicht über das DeviceInterface-Geräteobjekt verfügbar waren. Aus diesem Grund ist es wichtig, beim Erstellen der AQS-Filterzeichenfolgen sicherzustellen, dass die angeforderten Eigenschaften für die DeviceInformationKind-Objekte verfügbar sind, die Sie aufzählen. Weitere Informationen zum Erstellen eines Filters finden Sie unter Erstellen einer Geräteauswahl.
Beim Aufzählen von AssociationEndpoint-, AssociationEndpointContainer- oder AssociationEndpointService-Objekten werden Sie über ein Drahtlos- oder Netzwerkprotokoll aufgezählt. In diesen Situationen wird empfohlen, findAllAsync nicht zu verwenden und stattdessen CreateWatcher zu verwenden. Dies liegt daran, dass die Suche über ein Netzwerk häufig zu Suchvorgängen führt, die vor dem Generieren von EnumerationCompleted kein Timeout für 10 oder mehr Sekunden haben. FindAllAsync schließt den Vorgang erst ab, wenn EnumerationCompleted ausgelöst wird. Wenn Sie ein DeviceWatcher-Element verwenden, erhalten Sie ergebnisse näher an Echtzeit, unabhängig davon, wann EnumerationCompleted aufgerufen wird.
Speichern eines Geräts zur späteren Verwendung
Jedes DeviceInformation-Objekt wird durch eine Kombination aus zwei Informationsteilen eindeutig identifiziert: DeviceInformation.Id und DeviceInformation.Kind. Wenn Sie diese beiden Informationen beibehalten, können Sie ein DeviceInformation-Objekt neu erstellen, nachdem es verloren gegangen ist, indem Sie diese Informationen an CreateFromIdAsync bereitstellen. Wenn Sie dies tun, können Sie Benutzereinstellungen für ein Gerät speichern, das in Ihre App integriert ist.