Partager via


Énumérer les appareils

Les API Windows.Devices.Énumération 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 un instantané avec la commande FindAllAsync (expliqué plus en détail dans une section ci-dessous).

async void enumerateSnapshot(){
  DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}

Pour obtenir un exemple plus avancé des API Windows.Devices.Enumeration, consultez l’exemple d’énumération et de jumelage d’appareils.

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 à connecter à votre application.
  • Obtention d’informations sur les appareils connectés au système ou détectables par celui-ci.
  • Réception par une application de notifications en cas d’ajout, de connexion, de déconnexion, de changement de statut de connexion ou de modification d’autres propriétés d’appareils.
  • Réception par une application de déclencheurs d’arrière-plan en cas de connexion, de déconnexion, de changement de statut de connexion ou de modification d’autres propriétés d’appareils.

Ces API peuvent énumérer les appareils sur l’un des protocoles et bus suivants, à condition que l’appareil et le système exécutant l’application prennent en charge cette technologie. Cette liste n’est pas exhaustive. D’autres protocoles peuvent être pris en charge par un appareil spécifique.

Dans de nombreux cas, vous ne devez pas vous soucier de l’utilisation des API d’énumération. En effet, 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 le récepteur audio par défaut. Tant que votre application peut utiliser l’appareil par défaut, il est inutile d’utiliser les API d’énumération dans l’application. Les API d’énumération constituent une solution générale et souple pour détecter les appareils disponibles et s’y connecter. Cette rubrique fournit des informations sur l’énumération des appareils et décrit les quatre méthodes courantes pour énumérer les appareils.

  • Utilisation de l’interface utilisateur DevicePicker
  • Énumération d’une capture instantanée d’appareils actuellement détectables par le système
  • Énumération d’appareils actuellement détectables et observation des modifications
  • Énumération d’appareils actuellement détectables et observation des modifications dans une tâche en arrière-plan

Objets DeviceInformation

Lorsque vous utilisez 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 présente certaines des propriétés DeviceInformation intéressantes. Pour obtenir la liste complète, consultez la page de référence pour DeviceInformation.

Propriété Commentaires
DeviceInformation.Id Ceci est l’identificateur unique de l’appareil, fourni en tant que variable de chaîne. Dans la plupart des cas, il s’agit d’une valeur opaque que vous allez simplement transmettre d’une méthode à l’autre pour indiquer l’appareil spécifique qui vous intéresse. Vous pouvez également utiliser la propriété DeviceInformation.Kind après la fermeture puis la réouverture de votre application. Cela garantit que vous pouvez récupérer et réutiliser le même objet DeviceInformation .
DeviceInformation.Kind Cela indique le genre d’objet 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 de genres différents. Les valeurs possibles de cette propriété sont répertoriées dans DeviceInformationKind , ainsi que leur relation les unes avec les autres.
DeviceInformation.Properties Ce conteneur de propriétés contient les informations demandées pour l’objet DeviceInformation . Les propriétés les plus communes sont facilement référencées en tant que propriétés de l’objet DeviceInformation, comme avec DeviceInformation.Name. Pour plus d’informations, voir Propriétés d’informations d’appareil.

 

Interface utilisateur DevicePicker

DevicePicker est un contrôle fourni par Windows, qui crée une petite interface permettant à 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 ajouter uniquement un sélecteur ou une classe, mais s’il vous en faut davantage, vous pouvez en ajouter plusieurs. Si vous ajoutez plusieurs classes ou sélecteurs, ils sont unis à 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 du DevicePicker lorsqu’il s’affiche.

Quand DevicePicker est affiché, le contenu de l’interface utilisateur est automatiquement mis à jour si des appareils sont ajoutés, supprimés ou mis à jour.

Remarque Vous ne pouvez pas spécifier DeviceInformationKind à l’aide de DevicePicker. Si vous souhaitez disposer d’appareils avec 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. Il s’agit respectivement de CastingDevicePicker et DialDevicePicker.

Énumérer une capture instantanée d’appareils

Dans certains scénarios, le DevicePicker ne sera pas adapté à vos besoins et vous avez besoin de quelque chose de plus flexible. Peut-être souhaiterez-vous créer votre propre interface utilisateur ou devrez-vous énumérer les appareils sans afficher d’interface à l’utilisateur. Dans ces situations, vous pouvez énumérer une capture instantanée d’appareils. Cette opération implique de parcourir les appareils actuellement connectés ou associés au système. Toutefois, gardez à l’esprit que cette méthode examine uniquement une capture instantanée d’appareils disponibles. Vous ne trouverez donc pas les appareils qui se connectent après l’énumération de la liste. Par ailleurs, vous ne serez pas averti si un appareil est mis à jour ou supprimé. Un autre inconvénient potentiel est que cette méthode retient tous les résultats jusqu’à ce que l’énumération soit terminée. C’est pourquoi vous ne devez pas utiliser cette méthode quand vous vous intéressez à des objets AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService, dans la mesure où ils se trouvent sur un protocole réseau ou sans fil. L’opération peut prendre jusqu’à 30 secondes. Dans ce scénario, vous devez utiliser un objet DeviceWatcher pour énumérer les appareils possibles.

Pour énumérer une instantané d’appareils, utilisez la méthode FindAllAsync. Cette méthode attend que le processus d’énumération soit terminé et renvoie tous les résultats sous la forme d’un seul objet DeviceInformationCollection. Cette méthode est également surchargée pour vous offrir plusieurs options de filtrage des résultats et limiter ceux-ci aux appareils qui vous intéressent. Pour ce faire, fournissez une 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 à énumérer. Pour plus d’informations, voir Créer un sélecteur d’appareil.

En plus de limiter les résultats, vous pouvez spécifier les propriétés à récupérer pour les appareils. Dans ce cas, les propriétés spécifiées seront disponibles dans le conteneur des propriétés pour chacun des objets DeviceInformation renvoyés dans la collection. Il est important de noter que toutes les propriétés ne sont pas disponibles pour tous les genres d’appareils. Pour connaître les propriétés disponibles pour les types d’appareils, consultez Propriétés d’informations sur l’appareil.

Énumérer et observer des appareils

Une méthode plus puissante et plus flexible d’énumération des appareils consiste à créer un DeviceWatcher. Cette option offre davantage de souplesse lors de l’énumération d’appareils. Elle vous permet d’énumérer les appareils actuellement présents, ainsi que de recevoir des notifications lorsque des appareils correspondant à votre sélecteur d’appareil sont ajoutés, supprimés, ou lorsque des propriétés sont modifiées. Lorsque vous créez un DeviceWatcher, vous fournissez un sélecteur d’appareil. Pour plus d’informations sur les sélecteurs d’appareil, voir Créer un sélecteur d’appareil. Après avoir créé l’observateur, vous recevrez les notifications suivantes pour tout appareil correspondant aux critères fournis.

  • Notification d’ajout lorsqu’un nouvel appareil est ajouté.
  • Notification de mise à jour lorsqu’une propriété qui vous intéresse est modifiée.
  • Notification de suppression 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 vous y ajoutez, supprimez des éléments de celle-ci ou mettez à jour des éléments à mesure que votre observateur reçoit des 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 d’abord l’information deviceinformation appropriée qui a changé. Ensuite, appelez 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 à mesure que des appareils arrivent et lorsqu’ils sont modifiés, vous devez utiliser cette méthode d’énumération des appareils lorsque vous vous intéressez à des objets AssociationEndpoint, AssociationEndpointContainer ou AssociationEndpointService car ils sont énumérés sur les 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 une 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 voulez énumérer. Pour plus d’informations, voir Créer un sélecteur d’appareil. Vous pouvez également spécifier les propriétés à récupérer pour les appareils et qui vous intéressent. Dans ce cas, les propriétés spécifiées seront disponibles dans le conteneur des propriétés pour chacun des objets DeviceInformation renvoyés dans la collection. Il est important de noter que toutes les propriétés ne sont pas disponibles pour tous les genres d’appareils. Pour voir les propriétés disponibles selon les genres d’appareils, voir Propriétés d’informations d’appareil

Observer des appareils en tant que 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 quand même en premier lieu 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 : ajout, suppression ou mise à jour. Vous ne pouvez pas demander la mise à jour ou la suppression sans demander l’ajout. Une fois que vous inscrivez le déclencheur, le DeviceWatcher commence immédiatement à s’exécuter en arrière-plan. À partir de là, chaque fois qu’il 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 recevez les dernières modifications apportées depuis le dernier déclenchement de votre application.

Important La première fois qu’un DeviceWatcherTrigger déclenche votre application survient lorsque l’état EnumerationCompleted de l’observateur est atteint. Cela signifie qu’il contient tous les résultats initiaux. Les fois suivantes où il déclenche votre application, il ne contient que les notifications d’ajout, de mise à jour et de suppression qui ont eu lieu depuis le dernier déclencheur. C’est légèrement différent d’un objet DeviceWatcher de premier plan car les résultats initiaux n’arrivent pas un à un et sont uniquement livrés de manière groupée une fois que l’état EnumerationCompleted est atteint.

 

Certains protocoles sans fil se comportent différemment selon qu’ils analysent en arrière-plan ou au premier plan, ou ils peuvent ne pas du tout prendre en charge l’analyse en arrière-plan. L’analyse en arrière-plan présente trois possibilités. Le tableau suivant répertorie les possibilités et les effets qu’elles peuvent produire sur votre application. Par exemple, Bluetooth et Wi-Fi Direct ne pas prennent en charge les analyses en arrière-plan, et par conséquent, ne gèrent pas l’objet DeviceWatcherTrigger.

Comportement Impact
Même comportement en arrière-plan Aucun
Seules les analyses passives sont possibles en arrière-plan La détection d’appareils peut être plus longue pendant l’attente d’une analyse passive.
Les analyses en arrière-plan ne sont pas prises en charge. Aucun appareil ne sera détecté par le DeviceWatcherTrigger, et aucune mise à jour ne sera signalée.

 

Si votre DeviceWatcherTrigger inclut un protocole qui ne prend pas en charge l’analyse dans en tant que tâche en arrière-plan, votre déclencheur fonctionnera toujours. Toutefois, vous ne serez pas en mesure d’obtenir les mises à jour ou les résultats sur ce protocole. Les mises à jour pour d’autres protocoles ou appareils seront toujours détectées normalement.

Utilisation de DeviceInformationKind

Dans la plupart des scénarios, vous n’aurez pas à vous soucier du DeviceInformationKind d’un objet DeviceInformation. En effet, le sélecteur d’appareil renvoyé par l’API d’appareil que vous utilisez garantit souvent les genres d’objets appareil à utiliser avec leur API. Toutefois, dans certains scénarios, vous souhaiterez obtenir les DeviceInformation des appareils, mais une API d’appareil correspondante ne sera pas disponible pour fournir un sélecteur d’appareil. Dans ces cas, vous devrez créer votre propre sélecteur. Par exemple, Web Services on Devices ne dispose pas d’une API dédiée, mais vous pouvez détecter ces appareils et obtenir des informations les concernant à 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 est important pour vous de comprendre. Tous les genres possibles, de même que la manière dont ils sont associés, sont décrits sur la page de référence de DeviceInformationKind. L’une des utilisations les plus courantes de DeviceInformationKind consiste à spécifier quels genres d’appareils vous recherchez lors de l’envoi d’une requête en conjonction avec un sélecteur d’appareil. Cela garantit que vous énumérez uniquement sur les appareils correspondant à la valeur DeviceInformationKind fournie. Par exemple, vous pouvez trouver un objet DeviceInterface, puis exécuter une requête afin d’obtenir des informations relatives à 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 pour un objet DeviceInformation varient en fonction du DeviceInformationKind de l’appareil. Certaines propriétés sont disponibles uniquement avec certains genres. Pour plus d’informations sur les propriétés disponibles pour les différents genres, voir Propriétés d’informations d’appareil. Par conséquent, dans l’exemple ci-dessus, la recherche du parent Device vous donnera accès à des informations supplémentaires qui n’étaient pas disponibles à partir de l’objet appareil DeviceInterface. Pour cette raison, lorsque vous créez vos chaînes de filtre AQS, il est important de vérifier 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, voir Créer un sélecteur d’appareil.

Lors de l’énumération d’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 , mais plutôt d’utiliser CreateWatcher. En effet, effectuer des recherches sur un réseau entraîne souvent des opérations de recherche qui n’expirent pas pendant au moins 10 secondes avant de générer EnumerationCompleted. FindAllAsync n’achève pas son opération tant que EnumerationCompleted n’est pas déclenché. Si vous utilisez un DeviceWatcher, vous obtenez des résultats plus proches du temps réel, quel que soit le moment d’appel de EnumerationCompleted.

Enregistrer un appareil en vue d’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. Dans ce cas, vous pouvez enregistrer les préférences utilisateur pour un appareil qui s’intègre à votre application.