Inicio rápido: enumeración de dispositivos usados habitualmente (HTML)
[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente
El espacio de nombres Windows.Devices.Enumeration proporciona dos métodos para enumerar dispositivos: FindAllAsync y CreateWatcher. FindAllAsync realiza una búsqueda única de los dispositivos disponibles y se recomienda para aplicaciones que no necesitan actualizaciones si un usuario agrega, elimina o cambia un dispositivo. CreateWatcher enumera los dispositivos y genera eventos de notificación cuando un usuario agrega, elimina o cambia un dispositivo después de que el sistema operativo finalice la enumeración inicial. A continuación te mostramos cómo realizar una enumeración única de los dispositivos usados habitualmente con FindAllAsync.
Objetivo: Enumerar los dispositivos disponibles en categorías habituales de dispositivos mediante el espacio de nombres Windows.Devices.Enumeration.
Requisitos previos
Suponemos que estás familiarizado con JavaScript y HTML.
Tiempo para finalizar: 20 minutos.
Instrucciones
1. Abrir Microsoft Visual Studio
Abre una instancia de Visual Studio.
2. Crear un nuevo proyecto
En el cuadro de diálogo Nuevo proyecto, elige una aplicación vacía en los tipos de proyecto de JavaScript.
3. Insertar la aplicación HTML
Abre el archivo Default.html y copia este código en él, sustituyendo su contenido.
Este código HTML proporciona una interfaz de usuario que permite a los usuarios seleccionar entre siete tipos de dispositivos para enumerarlos: micrófonos, reproducción de audio, cámaras web, almacenamiento extraíble, servicios de dispositivos MTP, dispositivos SMS y dispositivos de proximidad.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="/js/default.js"></script>
</head>
<body data-design-activate="defaultPage.activated">
<h1>Device Enumeration Sample</h1>
<h2 >Input</h2>
<div>
<div id="Input">
<p>This scenario demonstrates using the device enumeration API
to look for specific device interfaces. A device interface
is the programmatic entry point for a device.</p>
<p>Select a device interface class</p>
<select id="SelectInterfaceClass" size="7" >
<option value="audioCapture">Audio Capture</option>
<option value="audioRender">Audio Playback</option>
<option value="videoCapture">Webcams</option>
<option value="portableStorageDevice">Portable Storage</option>
<option value="mtpService">MTP Device Service</option>
<option value="sms">SMS Device</option>
<option value="proximity">Proxmity Device</option>
</select>
<br />
<p>Clicking the enumerate button will start a search for
device interfaces that belong to the specified device interface class.
The device interfaces will be listed below.</p>
<input onclick="onEnumerateDeviceInterfaces()" type="button" value="Enumerate" />
<br /><br />
</div>
</div>
<h2> Output</h2>
<div id="statusMessage"></div>
<!-- Device Enumeration results are displayed in this element -->
<div id="Output"></div>
</body>
</html>
4. Insertar la aplicación JavaScript
Abre el archivo Default.js e inserta el código siguiente.
En función del tipo de dispositivo seleccionado por el usuario, la función onEnumerateDeviceInterface elige un valor de DeviceClass u obtiene una cadena de selector de una función getDeviceSelector. A continuación, la aplicación pasa este valor a FindAllAsync. La función successCallback imprime la información de los dispositivos si la enumeración se realiza correctamente y, en caso contrario, la función errorCallback imprime un mensaje de error.
function onEnumerateDeviceInterfaces() {
document.getElementById("Output").innerHTML = ""; // clear output
try {
var selection = document.getElementById("SelectInterfaceClass");
var selectedDeviceClass =
selection.options[selection.selectedIndex].value;
var deviceClass;
var Enumeration = Windows.Devices.Enumeration;
var selectorString = "";
var mtpServiceDevice = Windows.Devices.Portable.ServiceDevice;
var smsDevice = Windows.Devices.Sms.SmsDevice;
var proximityDevice = Windows.Networking.Proximity.ProximityDevice;
switch (selectedDeviceClass) {
case "audioCapture":
// same as:
// var mediaDevice = Windows.Media.Devices.MediaDevice;
// selectorString = mediaDevice.getAudioCaptureSelector();
deviceClass = Enumeration.DeviceClass.audioCapture;
break;
case "audioRender":
// same as:
// var mediaDevice = Windows.Media.Devices.MediaDevice;
// selectorString = mediaDevice.getAudioRenderSelector();
deviceClass = Enumeration.DeviceClass.audioRender;
break;
case "portableStorageDevice":
// same as:
// var storageDevice = Windows.Devices.Portable.StorageDevice;
// selectorString = storageDevice.getDeviceSelector();
deviceClass = Enumeration.DeviceClass.portableStorageDevice;
break;
case "videoCapture":
// same as:
// var mediaDevice = Windows.Media.Devices.MediaDevice;
// selectorString = mediaDevice.getVideoCaptureSelector();
deviceClass = Enumeration.DeviceClass.videoCapture;
break;
case "mtpService":
// Windows.Devices.Portable.ServiceDevice.getDeviceSelector
selectorString = mtpServiceDevice.getDeviceSelector(Windows.Devices.Portable.ServiceDeviceType.calendarService);
break;
case "sms":
// Windows.Devices.Sms.SmsDevice.getDeviceSelector
selectorString = smsDevice.getDeviceSelector();
break;
case "proximity":
// Windows.Networking.Proximity.ProximityDevice.getDeviceSelector
selectorString = proximityDevice.getDeviceSelector();
break;
case "imageScanner":
// same as:
// var scannerDevice = Windows.Devices.Scanners.ImageScanner;
// selectorString = scannerDevice.getDeviceSelector();
deviceClass = Enumeration.DeviceClass.imageScanner;
break;
default: deviceClass = Enumeration.DeviceClass.all;
}
var DeviceInformation = Enumeration.DeviceInformation;
if (selectorString == "") {
DeviceInformation.findAllAsync(deviceClass).then(
successCallback,
errorCallback
);
} else {
DeviceInformation.findAllAsync(selectorString, null).then(
successCallback,
errorCallback
);
}
} catch (e) {
document.getElementById("statusMessage").innerHTML =
"Failed to enumerate devices, error: " + e.message;
}
}
// Handles successful completion of the findAllAsync method.
function successCallback(deviceInformationCollection) {
var numDevices = deviceInformationCollection.length;
document.getElementById("statusMessage").innerHTML =
numDevices + " device interface(s) found";
if (numDevices) {
for (var i = 0; i < numDevices; i++) {
printFriendlyNameAndID(deviceInformationCollection[i],
document.getElementById("Output"));
}
} else {
document.getElementById("statusMessage").innerHTML = "No devices found";
}
}
// Handles an error completion of the findAllAsync method.
function errorCallback(e) {
document.getElementById("statusMessage").innerHTML =
"Failed to find devices, error: " + e.message;
}
// Prints the friendly name of the device interface and its ID
// The ID is the device interface path.
function printFriendlyNameAndID(deviceInterface, log) {
// The name property is equivalent to System.ItemNameDisplay property
log.innerHTML += "<h3>" +
deviceInterface.name + "<h3/>";
log.innerHTML += "<p>Interface ID: " + deviceInterface.id;
log.innerHTML += "<p>Enabled: " + deviceInterface.isEnabled;
log.innerHTML += "<br />";
}
Nota
Para las primeras cuatro opciones puedes pasar un valor de la enumeración DeviceClass a FindAllAsync. Esto equivale a obtener una cadena de selector de la API de Windows en tiempo de ejecución asociada con el tipo de dispositivo y pasar el selector a FindAllAsync. El código para usar la cadena de selector en lugar de la enumeración DeviceClass se comenta en los casos relevantes en la instrucción switch.
Para las últimas tres opciones, no hay ningún valor de la enumeración DeviceClass, por lo que solo se muestra la llamada API para obtener la cadena de selección apropiada.
5. Generar la aplicación
En el menú Generar, haz clic en Generar solución para generar el proyecto.
6. Probar la aplicación
- En el menú Depurar, haz clic en Iniciar depuración para probar la solución.
- Elige la clase de interfaz de dispositivo que quieres enumerar.
- Haz clic en el botón Enumerar para iniciar una búsqueda de las interfaces de dispositivo que pertenezcan a la clase de interfaz de dispositivo especificada. La aplicación enumera las interfaces de dispositivo en la mitad inferior de la página que crea.
7. Agregar tus propias funciones de dispositivo (opcional)
Para iniciar el acceso a las funciones de dispositivo en lugar de solo enumerarlos, pasa la propiedad DeviceInformation.id de un dispositivo que hayas enumerado a la API de Windows en tiempo de ejecución para usar el dispositivo. Por ejemplo, puedes usar el identificador de una cámara web enumerada para establecer la propiedad Windows.Media.Capture.MediaCaptureInitializationSettings.VideoDeviceId con el fin de especificar la cámara web que se usará para la captura de vídeo.
Agrega las funcionalidades que necesites al archivo package.appxmanifest del proyecto.
Para empezar, pasa el identificador del dispositivo a una API que puedas usar para interactuar con el dispositivo. Estos son algunos de los métodos que toman un identificador de dispositivo para inicializar un objeto a fin de usar un dispositivo:
- Windows.Media.Capture.MediaCaptureInitializationSettings.AudioDeviceId
- Windows.Media.Capture.MediaCaptureInitializationSettings.VideoDeviceId
- Windows.Devices.Portable.StorageDevice.FromId
- Windows.Devices.Sms.SmsDevice.FromIdAsync
- Windows.Networking.Proximity.ProximityDevice.FromId
Para los dispositivos WPD que usen un servicio de dispositivos MTP (enumerados con Windows.Devices.Portable.ServiceDevice.GetDeviceSelector o Windows.Devices.Portable.ServiceDevice.GetDeviceSelectorFromServiceId), puedes crear un objeto de automatización COM para que funcione con el dispositivo de la siguiente manera:
deviceFactory = new ActiveXObject("PortableDeviceAutomation.Factory");
var device = deviceFactory.getDeviceFromId(deviceId);
Resumen y siguientes pasos
Acabas de aprender a enumerar tipos habituales de dispositivos con el paso de un valor de la enumeración Windows.Device.Enumeration.DeviceClass o una cadena de selector desde un método getDeviceSelector a findAllAsync.
Si la clase de interfaz de dispositivo que quieres no está en la enumeración Windows.Device.Enumeration.DeviceClass y no hay ninguna API de Windows en tiempo de ejecución para obtener un selector, tendrás que generar una cadena de Sintaxis de consulta avanzada (AQS) tú mismo y pasarla a findAllAsync.
Para crear una consulta sobre dispositivos disponibles de un tipo especificado, tienes que conocer el GUID de clase de dispositivo. El código siguiente incluye una consulta de los dispositivos disponibles que pertenecen a una clase de interfaz de dispositivo especificada por un GUID escrito por el usuario en un cuadro de entrada. El GUID debe tener el formato "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".
Nota Asegúrate de que el GUID esté incluido entre comillas en la cadena de selector. Por ejemplo, var selectorString = "System.Devices.InterfaceClassGuid:=\"{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\"";
.
if (textinput.value != ""){
var textDeviceInterfaceClassGUID = textinput.value;
var selectorString = "System.Devices.InterfaceClassGuid:=\"" +
textDeviceInterfaceClassGUID +
"\" AND System.Devices.InterfaceEnabled:=true";
var Enum = Windows.Devices.Enumeration;
Enum.DeviceInformation.findAllAsync(selectorString, null).then(
successCallback,
errorCallback
);
// Handles successful completion of the findAllAsync method.
function successCallback(deviceInformationCollection) {
// Add your code here for processing the enumerated device collection.
}
// Handles an error completion of the findAllAsync method.
function errorCallback(e) {
// Add your error-handling code here.
}
Nota En este ejemplo se ha realizado una enumeración única, pero esto no será suficiente para una aplicación que deba actualizar su interfaz de usuario cuando un usuario agregue, quite o cambie un dispositivo. En el tema siguiente verás cómo usar CreateWatcher para enumerar los dispositivos y obtener notificaciones sobre estos.
Cómo enumerar de manera dinámica
Temas relacionados
API de Windows en tiempo de ejecución que proporcionan cadenas de selector para la enumeración
Windows.Media.Devices.MediaDevice.getAudioCaptureSelector
Windows.Media.Devices.MediaDevice.getAudioRenderSelector
Windows.Media.Devices.MediaDevice.getVideoCaptureSelector
Windows.Media.Devices.MediaDevice.getDefaultAudioRenderId
Windows.Media.Devices.MediaDevice.getDefaultAudioCaptureId
Windows.Devices.Portable.StorageDevice.GetDeviceSelector
Windows.Devices.Portable.ServiceDevice.GetDeviceSelector
Windows.Devices.Portable.ServiceDevice.GetDeviceSelectorFromServiceId
Windows.Devices.Sms.SmsDevice.GetDeviceSelector
Windows.Networking.Proximity.ProximityDevice.GetDeviceSelector
Sintaxis de consulta avanzada (AQS) para generar cadenas de selector
Uso de la sintaxis de consulta avanzada mediante programación