Crear un selector de dispositivos
Un selector de dispositivos permite limitar los dispositivos a buscar al enumerar dispositivos, lo que le ayuda a obtener resultados más relevantes y a mejorar el rendimiento del sistema.
En la mayoría de los escenarios, obtiene un selector de dispositivos de una pila de dispositivos. Por ejemplo, puede usar GetDeviceSelector para dispositivos detectados a través de USB. Estos selectores de dispositivos devuelven una cadena de sintaxis de consulta avanzada (AQS). Para obtener más información sobre el formato AQS, consulte Uso de la sintaxis de consulta avanzada mediante programación.
API importantes
Creación de la cadena de filtro
Hay algunos casos en los que es necesario enumerar dispositivos y un selector de dispositivos proporcionado no está disponible para su escenario. Un selector de dispositivos es una cadena de filtro de AQS que contiene la siguiente información. Antes de crear una cadena de filtro, debe conocer algunos fragmentos clave de información sobre los dispositivos que desea enumerar.
- DeviceInformationKind de los dispositivos que le interesan. Para obtener más información sobre cómo DeviceInformationKind afecta a la enumeración de dispositivos, consulte Enumerar dispositivos.
- Cómo crear una cadena de filtro de AQS (que se explica en este tema).
- Las propiedades que le interesan. Las propiedades disponibles dependerán de DeviceInformationKind. Consulte Propiedades de información del dispositivo para obtener más información.
- Los protocolos que está consultando. Esto solo es necesario si busca dispositivos a través de una red inalámbrica o cableada. Para obtener más información sobre cómo hacerlo, consulte Enumerar dispositivos a través de una red.
Al usar las API de Windows.Devices.Enumeration , se combina con frecuencia el selector de dispositivos con el tipo de dispositivo que le interesa. La lista disponible de tipos de dispositivos se define mediante la enumeración DeviceInformationKind. Esta combinación de factores le ayuda a limitar los dispositivos que están disponibles para los que le interesan. Si no especifica deviceInformationKind o el método que usa no proporciona un parámetro DeviceInformationKind, el tipo predeterminado es DeviceInterface.
Las API Windows.Devices.Enumeration usan la sintaxis AQS canónica, pero no todos los operadores son compatibles. Para obtener una lista de las propiedades que están disponibles al construir la cadena de filtro, consulte Propiedades de información del dispositivo.
Precaución
Las propiedades personalizadas definidas con el {GUID} PID
formato no se pueden usar al construir la cadena de filtro de AQS. Esto se debe a que el tipo de propiedad se deriva del nombre de propiedad conocido.
En la tabla siguiente se enumeran los operadores de AQS y qué tipos de parámetros admiten.
Operador | Tipos admitidos |
---|---|
COP_EQUAL | String, boolean, GUID, UInt16, UInt32 |
COP_NOTEQUAL | String, boolean, GUID, UInt16, UInt32 |
COP_LESSTHAN | UInt16, UInt32 |
COP_GREATERTHAN | UInt16, UInt32 |
COP_LESSTHANOREQUAL | UInt16, UInt32 |
COP_GREATERTHANOREQUAL | UInt16, UInt32 |
COP_VALUE_CONTAINS | String, string array, boolean array, GUID array, UInt16 array, UInt32 array |
COP_VALUE_NOTCONTAINS | String, string array, boolean array, GUID array, UInt16 array, UInt32 array |
COP_VALUE_STARTSWITH | Cadena |
COP_VALUE_ENDSWITH | Cadena |
COP_DOSWILDCARDS | No compatible |
COP_WORD_EQUAL | No compatible |
COP_WORD_STARTSWITH | No compatible |
COP_APPLICATION_SPECIFIC | No compatible |
Puede especificar NULL para COP_EQUAL o COP_NOTEQUAL. Esto se traduce en una propiedad sin ningún valor o que el valor no existe. En AQS, especifique NULL mediante corchetes vacíos [].
Importante
Al usar los operadores COP_VALUE_CONTAINS y COP_VALUE_NOTCONTAINS , se comportan de forma diferente con cadenas y matrices de cadenas. En el caso de una cadena, el sistema realizará una búsqueda sin distinción entre mayúsculas y minúsculas para ver si el dispositivo contiene la cadena indicada como una subcadena. En el caso de una matriz de cadenas, no se buscan subcadenas. Con la matriz de cadenas, se busca la matriz para ver si contiene toda la cadena especificada. No es posible buscar una matriz de cadenas para ver si los elementos de la matriz contienen una subcadena.
Si no puede crear una sola cadena de filtro de AQS que limitará los resultados correctamente, puede filtrar los resultados después de recibirlos. Sin embargo, se recomienda limitar los resultados de la cadena de filtro de AQS inicial tanto como sea posible al proporcionarlos a las API de Windows.Devices.Enumeration. Esto ayudará a mejorar el rendimiento de la aplicación.
Ejemplos de cadenas de AQS
En los ejemplos siguientes se muestra cómo se puede usar la sintaxis de AQS para limitar los dispositivos que desea enumerar. Todas estas cadenas de filtro se emparejan con un DeviceInformationKind para crear un filtro completo. Si no se especifica ningún tipo, recuerde que el tipo predeterminado es DeviceInterface.
Cuando este filtro está emparejado con deviceInformationKind de DeviceInterface, enumera todos los objetos que contienen la clase de interfaz de captura de audio y que están habilitados actualmente. = se traduce en COP_EQUALS.
System.Devices.InterfaceClassGuid:="{2eef81be-33fa-4800-9670-1cd474972c3f}" AND
System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True
Cuando este filtro está emparejado con un DeviceInformationKind de Device, enumera todos los objetos que tienen al menos un identificador de hardware de GenCdRom. ~~ se traduce en COP_VALUE_CONTAINS.
System.Devices.HardwareIds:~~"GenCdRom"
Cuando este filtro está emparejado con un DeviceInformationKind de DeviceContainer, enumera todos los objetos que tienen un nombre de modelo que contiene la subcadena Microsoft. ~~ se traduce en COP_VALUE_CONTAINS.
System.Devices.ModelName:~~"Microsoft"
Cuando este filtro está emparejado con deviceInformationKind de DeviceInterface, enumera todos los objetos que tienen un nombre a partir de la subcadena Microsoft. ~< se traduce en COP_STARTSWITH.
System.ItemNameDisplay:~<"Microsoft"
Cuando este filtro se empareja con un DeviceInformationKind de Device, enumera todos los objetos que tienen establecida una propiedad System.Devices.IpAddress. <>[] se traduce en COP_NOTEQUALS combinados con un valor NULL .
System.Devices.IpAddress:<>[]
Cuando este filtro está emparejado con un DeviceInformationKind de Device, enumera todos los objetos que no tienen establecida una propiedad System.Devices.IpAddress . =[] se traduce en COP_EQUALS combinado con un valor NULL .
System.Devices.IpAddress:=[]