Énumérer les appareils
Les API Windows.Devices.Enumeration vous permettent de trouver des appareils connectés en interne au système, connectés en externe ou détectables via des protocoles sans fil ou réseau.
Exemples
Le moyen le plus simple d’énumérer tous les appareils disponibles consiste à prendre une capture instantanée avec la commande FindAllAsync (expliquée plus loin dans une section ci-dessous).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
Consultez l’exemple d’énumération et de jumelage d’appareils pour obtenir un exemple plus avancé des API Windows.Devices.Enumeration.
API d’énumération
L’espace de noms Windows.Devices.Enumeration vous permet de rechercher des appareils connectés en interne au système, connectés en externe ou détectables via des protocoles sans fil ou réseau. Voici quelques-unes des fonctionnalités prises en charge par ces API :
- Recherche d’un appareil auquel se connecter avec votre application.
- Obtention d’informations sur les appareils connectés ou détectables par le système.
- Une application reçoit des notifications lorsque les appareils sont ajoutés, connectent, déconnectent, modifient l’état en ligne ou modifient d’autres propriétés.
- Avoir une application reçoit des déclencheurs en arrière-plan lorsque les appareils se connectent, déconnectent, modifient l’état en ligne ou modifient d’autres propriétés.
Ces API peuvent énumérer les appareils sur l’un des protocoles et bus suivants, à condition que l’appareil individuel et le système exécutant l’application prennent en charge cette technologie. Il ne s’agit pas d’une liste exhaustive, et d’autres protocoles peuvent être pris en charge par un appareil spécifique.
- Bus physiquement connectés. Cela inclut PCI et USB. Par exemple, tout ce que vous pouvez voir dans le Gestionnaire de périphériques.
- UPnP
- Digital Living Network Alliance (DLNA)
- Découverte et lancement (DIAL)
- Découverte du service DNS (DNS-SD)
- Services web sur les appareils (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- Point de service
Dans de nombreux cas, vous n’aurez pas besoin de vous soucier de l’utilisation des API d’énumération. Cela est dû au fait que de nombreuses API qui utilisent des appareils sélectionnent automatiquement l’appareil par défaut approprié ou fournissent une API d’énumération plus simplifiée. Par exemple, MediaElement utilise automatiquement l’appareil de renderer audio par défaut. Tant que votre application peut utiliser l’appareil par défaut, il n’est pas nécessaire d’utiliser les API d’énumération dans votre application. Les API d’énumération fournissent un moyen général et flexible pour vous de découvrir et de vous connecter aux appareils disponibles. Cette rubrique fournit des informations sur l’énumération des appareils et décrit les quatre façons courantes d’énumérer les appareils.
- Utilisation de l’interface utilisateur DevicePicker
- Énumération d’un instantané des appareils actuellement détectables par le système
- Énumération des appareils actuellement détectables et regardez les modifications
- Énumérer les appareils actuellement détectables et surveiller les modifications dans une tâche en arrière-plan
Objets DeviceInformation
Avec les API d’énumération, vous devez fréquemment utiliser des objets DeviceInformation . Ces objets contiennent la plupart des informations disponibles sur l’appareil. Le tableau suivant explique certaines des propriétés DeviceInformation qui vous intéressent. Pour obtenir une liste complète, consultez la page de référence de DeviceInformation.
Propriété | Commentaires |
---|---|
DeviceInformation.Id | Il s’agit de l’identificateur unique de l’appareil et est fourni en tant que variable de chaîne. Dans la plupart des cas, il s’agit d’une valeur opaque que vous allez passer d’une méthode à une autre pour indiquer l’appareil spécifique qui vous intéresse. Vous pouvez également utiliser cette propriété et la propriété DeviceInformation.Kind après la fermeture de votre application et sa réouverture. Cela garantit que vous pouvez récupérer et réutiliser le même objet DeviceInformation . |
DeviceInformation.Kind | Cela indique le type d’objet d’appareil représenté par l’objet DeviceInformation . Il ne s’agit pas de la catégorie d’appareil ou du type d’appareil. Un seul appareil peut être représenté par plusieurs objets DeviceInformation différents de différents types. Les valeurs possibles pour cette propriété sont répertoriées dans DeviceInformationKind , ainsi que la façon dont elles se rapportent les unes aux autres. |
DeviceInformation.Properties | Ce conteneur de propriétés contient des informations demandées pour l’objet DeviceInformation . Les propriétés les plus courantes sont facilement référencées en tant que propriétés de l’objet DeviceInformation, comme avec DeviceInformation.Name. Pour plus d’informations, consultez les propriétés d’informations sur l’appareil. |
Interface utilisateur DevicePicker
DevicePicker est un contrôle fourni par Windows qui crée une petite interface utilisateur qui permet à l’utilisateur de sélectionner un appareil dans une liste. Il peut être personnalisé de plusieurs façons, par exemple :
- Contrôlez les appareils affichés dans l’interface utilisateur en ajoutant un SupportedDeviceSelectors, un SupportedDeviceClasses ou les deux à DevicePicker.Filter. Dans la plupart des cas, vous devez uniquement ajouter un sélecteur ou une classe, mais si vous en avez besoin plusieurs, vous pouvez ajouter plusieurs. Si vous ajoutez plusieurs sélecteurs ou classes, ils sont joints à l’aide d’une fonction logique OR.
- Spécifiez les propriétés que vous souhaitez récupérer pour les appareils. Pour ce faire, ajoutez des propriétés à DevicePicker.RequestedProperties.
- Modifiez l’apparence de DevicePicker à l’aide de l’apparence.
- Spécifiez la taille et l’emplacement de DevicePicker lorsqu’il est affiché.
Pendant l’affichage de DevicePicker , le contenu de l’interface utilisateur est automatiquement mis à jour si les appareils sont ajoutés, supprimés ou mis à jour.
Notez que vous ne pouvez pas spécifier DeviceInformationKind à l’aide de DevicePicker. Si vous souhaitez avoir des appareils d’un DeviceInformationKind spécifique, vous devez créer un DeviceWatcher et fournir votre propre interface utilisateur.
La diffusion de contenu multimédia et dial fournissent également leurs propres sélecteurs si vous souhaitez les utiliser. Ils sont CastingDevicePicker et DialDevicePicker, respectivement.
Énumérer un instantané d’appareils
Dans certains scénarios, DevicePicker ne convient pas à vos besoins et vous avez besoin d’un élément plus flexible. Peut-être souhaitez-vous créer votre propre interface utilisateur ou avoir besoin d’énumérer des appareils sans afficher une interface utilisateur à l’utilisateur. Dans ces situations, vous pouvez énumérer un instantané d’appareils. Cela implique d’examiner les appareils actuellement connectés au système ou associés à celui-ci. Toutefois, vous devez savoir que cette méthode examine uniquement un instantané des appareils disponibles. Vous ne pourrez donc pas trouver les appareils qui se connectent après avoir énuméré la liste. Vous ne serez pas également averti si un appareil est mis à jour ou supprimé. Un autre inconvénient potentiel à connaître est que cette méthode conserve les résultats jusqu’à ce que l’énumération entière soit terminée. Pour cette raison, vous ne devez pas utiliser cette méthode lorsque vous êtes intéressé par les objets AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService , car ils sont trouvés sur un réseau ou un protocole sans fil. Cela peut prendre jusqu’à 30 secondes. Dans ce scénario, vous devez utiliser un objet DeviceWatcher pour énumérer les appareils possibles.
Pour énumérer un instantané d’appareils, utilisez la méthode FindAllAsync. Cette méthode attend que l’ensemble du processus d’énumération soit terminé et retourne tous les résultats sous la forme d’un objet DeviceInformationCollection. Cette méthode est également surchargée pour vous fournir plusieurs options pour filtrer vos résultats et les limiter aux appareils qui vous intéressent. Pour ce faire, fournissez un DeviceClass ou transmettez un sélecteur d’appareil. Le sélecteur d’appareil est une chaîne AQS (Advanced Query Syntax) qui spécifie les appareils que vous souhaitez énumérer. Pour plus d’informations, consultez Générer un sélecteur d’appareil.
En plus de limiter les résultats, vous pouvez également spécifier les propriétés que vous souhaitez récupérer pour les appareils. Si vous le faites, les propriétés spécifiées sont disponibles dans le conteneur de propriétés pour chacun des objets DeviceInformation retournés dans la collection. Il est important de noter que toutes les propriétés ne sont pas disponibles pour tous les types d’appareils. Pour voir quelles propriétés sont disponibles pour les types d’appareils, consultez les propriétés d’informations sur l’appareil.
Énumérer et regarder des appareils
Une méthode plus puissante et flexible d’énumération d’appareils crée un DeviceWatcher. Cette option offre la plus grande flexibilité lorsque vous énumérez des appareils. Il vous permet d’énumérer les appareils actuellement présents et de recevoir des notifications lorsque les appareils qui correspondent à votre sélecteur d’appareil sont ajoutés, supprimés ou modifiés. Lorsque vous créez un DeviceWatcher, vous fournissez un sélecteur d’appareil. Pour plus d’informations sur les sélecteurs d’appareils, consultez Générer un sélecteur d’appareil. Après avoir créé l’observateur, vous recevrez les notifications suivantes pour tous les appareils qui correspondent à vos critères fournis.
- Ajoutez une notification lorsqu’un nouvel appareil est ajouté.
- Notification de mise à jour lorsqu’une propriété qui vous intéresse est modifiée.
- Supprimez la notification lorsqu’un appareil n’est plus disponible ou ne correspond plus à votre filtre.
Dans la plupart des cas où vous utilisez un DeviceWatcher, vous conservez une liste d’appareils et ajoutez-y, supprimez des éléments de celui-ci ou mettez à jour les éléments à mesure que votre observateur reçoit les mises à jour des appareils que vous regardez. Lorsque vous recevez une notification de mise à jour, les informations mises à jour sont disponibles en tant qu’objet DeviceInformationUpdate . Pour mettre à jour votre liste d’appareils, recherchez tout d’abord le DeviceInformation approprié qui a changé. Appelez ensuite la méthode Update pour cet objet, en fournissant l’objet DeviceInformationUpdate. Il s’agit d’une fonction pratique qui met automatiquement à jour votre objet DeviceInformation .
Étant donné qu’un DeviceWatcher envoie des notifications en tant qu’appareils arrivent et lorsqu’ils changent, vous devez utiliser cette méthode d’énumération des appareils lorsque vous êtes intéressé par AssociationEndpoint, AssociationEndpointContainer ou les objets AssociationEndpointService, car ils sont énumérés sur des protocoles réseau ou sans fil.
Pour créer un DeviceWatcher, utilisez l’une des méthodes CreateWatcher. Ces méthodes sont surchargées pour vous permettre de spécifier les appareils qui vous intéressent. Pour ce faire, fournissez un DeviceClass ou transmettez un sélecteur d’appareil. Le sélecteur d’appareil est une chaîne AQS qui spécifie les appareils que vous souhaitez énumérer. Pour plus d’informations, consultez Générer un sélecteur d’appareil. Vous pouvez également spécifier les propriétés que vous souhaitez récupérer pour les appareils et qui vous intéressent. Si vous le faites, les propriétés spécifiées sont disponibles dans le conteneur de propriétés pour chacun des objets DeviceInformation retournés dans la collection. Il est important de noter que toutes les propriétés ne sont pas disponibles pour tous les types d’appareils. Pour voir quelles propriétés sont disponibles pour les types d’appareils, consultez les propriétés d’informations sur l’appareil
Regarder les appareils comme une tâche en arrière-plan
L’observation des appareils en tant que tâche en arrière-plan est très similaire à la création d’un DeviceWatcher , comme décrit ci-dessus. En fait, vous devrez toujours créer un objet DeviceWatcher normal, comme décrit dans la section précédente. Une fois que vous l’avez créé, vous appelez GetBackgroundTrigger au lieu de DeviceWatcher.Start. Lorsque vous appelez GetBackgroundTrigger, vous devez spécifier les notifications qui vous intéressent : ajouter, supprimer ou mettre à jour. Vous ne pouvez pas demander de mise à jour ou de suppression sans demander l’ajout. Une fois que vous avez inscrit le déclencheur, DeviceWatcher commence à s’exécuter immédiatement en arrière-plan. À partir de ce stade, chaque fois qu’elle reçoit une nouvelle notification pour votre application qui correspond à vos critères, la tâche en arrière-plan se déclenche et vous fournit les dernières modifications depuis qu’elle a déclenché votre application.
Important La première fois qu’un DeviceWatcherTrigger déclenche votre application, l’observateur atteint l’état EnumerationCompleted. Cela signifie qu’il contiendra tous les résultats initiaux. Toutes les prochaines fois qu’elle déclenche votre application, elle contiendra uniquement les notifications d’ajout, de mise à jour et de suppression qui se sont produites depuis le dernier déclencheur. Ceci est légèrement différent d’un objet DeviceWatcher de premier plan, car les résultats initiaux ne viennent pas en un à la fois et sont fournis uniquement dans un bundle une fois que l’ÉnumérationCompleted est atteinte.
Certains protocoles sans fil se comportent différemment s’ils analysent en arrière-plan par rapport au premier plan, ou ils peuvent ne pas prendre en charge l’analyse en arrière-plan du tout. Il existe trois possibilités par rapport à l’analyse en arrière-plan. Le tableau suivant répertorie les possibilités et les effets que cela peut avoir sur votre application. Par exemple, Bluetooth et Wi-Fi Direct ne prennent pas en charge les analyses en arrière-plan. Par extension, ils ne prennent pas en charge un DeviceWatcherTrigger.
Comportement | Impact |
---|---|
Même comportement en arrière-plan | Aucune |
Seules les analyses passives possibles en arrière-plan | L’appareil peut prendre plus de temps pour découvrir en attendant qu’une analyse passive se produise. |
Analyses en arrière-plan non prises en charge | Aucun appareil n’est détectable par DeviceWatcherTrigger et aucune mise à jour n’est signalée. |
Si votre DeviceWatcherTrigger inclut un protocole qui ne prend pas en charge l’analyse en tant que tâche en arrière-plan, votre déclencheur fonctionne toujours. Toutefois, vous ne pourrez pas obtenir de mises à jour ou de résultats sur ce protocole. Les mises à jour d’autres protocoles ou appareils sont toujours détectées normalement.
Utilisation de DeviceInformationKind
Dans la plupart des scénarios, vous n’aurez pas besoin de vous soucier de DeviceInformationKind d’un objet DeviceInformation. Cela est dû au fait que le sélecteur d’appareil retourné par l’API d’appareil que vous utilisez garantit souvent que vous obtenez les types appropriés d’objets d’appareil à utiliser avec leur API. Toutefois, dans certains scénarios, vous souhaiterez obtenir DeviceInformation pour les appareils, mais il n’existe pas d’API d’appareil correspondante pour fournir un sélecteur d’appareil. Dans ces cas, vous devez créer votre propre sélecteur. Par exemple, les services web sur les appareils n’ont pas d’API dédiée, mais vous pouvez découvrir ces appareils et obtenir des informations sur eux à l’aide des API Windows.Devices.Enumeration , puis les utiliser à l’aide des API de socket.
Si vous créez votre propre sélecteur d’appareil pour énumérer des objets d’appareil, DeviceInformationKind sera important pour vous de comprendre. Tous les types possibles, ainsi que la façon dont ils se rapportent les uns aux autres, sont décrits dans la page de référence pour DeviceInformationKind. L’une des utilisations les plus courantes de DeviceInformationKind consiste à spécifier le type d’appareils que vous recherchez lors de l’envoi d’une requête conjointement avec un sélecteur d’appareil. En procédant ainsi, il vous permet de vous assurer que vous énumérez uniquement les appareils qui correspondent à l’appareil DeviceInformationKind fourni. Par exemple, vous pouvez trouver un objet DeviceInterface, puis exécuter une requête pour obtenir les informations de l’objet Device parent. Cet objet parent peut contenir des informations supplémentaires.
Il est important de noter que les propriétés disponibles dans le conteneur de propriétés d’un objet DeviceInformation varient en fonction de DeviceInformationKind de l’appareil. Certaines propriétés sont disponibles uniquement avec certains types. Pour plus d’informations sur les propriétés disponibles pour les types, consultez les propriétés d’informations sur l’appareil. Par conséquent, dans l’exemple ci-dessus, la recherche de l’appareil parent vous donne accès à plus d’informations qui n’ont pas été disponibles à partir de l’objet device DeviceInterface. Pour cette raison, lorsque vous créez vos chaînes de filtre AQS, il est important de vous assurer que les propriétés demandées sont disponibles pour les objets DeviceInformationKind que vous énumérez. Pour plus d’informations sur la création d’un filtre, consultez Générer un sélecteur d’appareil.
Lors de l’énumération des objets AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService , vous énumérez sur un protocole sans fil ou réseau. Dans ces situations, nous vous recommandons de ne pas utiliser FindAllAsync et d’utiliser CreateWatcher. Cela est dû au fait que la recherche sur un réseau entraîne souvent des opérations de recherche qui ne délairont pas pendant 10 secondes ou plus avant de générer EnumerationCompleted. FindAllAsync ne termine pas son opération tant que EnumerationCompleted n’est pas déclenché. Si vous utilisez un DeviceWatcher, vous obtiendrez des résultats plus proches du temps réel, quel que soit le moment où EnumerationCompleted est appelé.
Enregistrer un appareil pour une utilisation ultérieure
Tout objet DeviceInformation est identifié de manière unique par une combinaison de deux informations : DeviceInformation.Id et DeviceInformation.Kind. Si vous conservez ces deux informations, vous pouvez recréer un objet DeviceInformation après sa perte en fournissant ces informations à CreateFromIdAsync. Si vous effectuez cette opération, vous pouvez enregistrer les préférences utilisateur d’un appareil qui s’intègre à votre application.