Cómo recibir una notificación de inserción del CD-ROM o la eliminación

Resumen

Algunas aplicaciones necesitan saber cuando el usuario inserta o quita un disco compacto o DVD desde una unidad de CD-ROM sin sondeo de cambios en los medios. Windows proporcionan una forma de notificar a estas aplicaciones a través del mensaje WM_DEVICECHANGE. Este artículo explica cómo controlar el mensaje WM_DEVICECHANGE para detectar cambios de CD-ROM o DVDmedia.

Más información

Windows envía un mensaje WM_DEVICECHANGE de todas las ventanas de nivel superior cuando se agregan y se disponga de nuevos dispositivos o medios, y cuando se quitan dispositivos existentes o medios. Cada mensaje WM_DEVICECHANGE tiene un evento asociado para describir el cambio y una estructura que proporciona información detallada acerca del cambio.


La estructura consta de un encabezado independiente del evento seguido por una estructura depende de sucesos. La parte dependiente de evento de la estructura describe qué dispositivo se aplica el evento. Para utilizar esta estructura, las aplicaciones en primer lugar deben determinar el tipo de evento y el tipo de dispositivo. A continuación, pueden utilizar la estructura correcta para tomar las medidas adecuadas.


Cuando el usuario inserta un nuevo disco compacto o DVD en una unidad, sus aplicaciones deben obtener un mensaje WM_DEVICECHANCE con un evento DBT_DEVICEARRIVAL. La aplicación debe comprobar el evento para asegurarse de que el tipo de dispositivo que llega es un volumen (DBT_DEVTYP_VOLUME) y que está establecido el indicador de medios del evento (DBTF_MEDIA).


Cuando el usuario quita un disco compacto de una unidad de CD-ROM o DVD, aplicaciones obtendrá un mensaje WM_DEVICECHANCE con un evento DBT_DEVICEREMOVECOMPLETE. Al igual que con DBT_DEVICEARRIVAL anterior, la aplicación debe comprobar el evento para asegurarse de que el dispositivo que se está quitando es un volumen y que está establecido el indicador de los medios de comunicación del evento.

Código de ejemplo

El código siguiente muestra cómo utilizar el mensaje WM_DEVICECHANGE para comprobar si el disco compacto o inserción de DVD o eliminación.

   #include <windows.h>   #include <dbt.h>

char FirstDriveFromMask (ULONG unitmask); //prototype


/*----------------------------------------------------------------------
Main_OnDeviceChange (hwnd, wParam, lParam)

Description
Handles WM_DEVICECHANGE messages sent to the application's
top-level window.
----------------------------------------------------------------------*/

void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{

PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
char szMsg[80];


switch(wParam)
{
case DBT_DEVICEARRIVAL:
// See if a CD-ROM or DVD was inserted into a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: arrived\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));

MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break;


case DBT_DEVICEREMOVECOMPLETE:
// See if a CD-ROM was removed from a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: was removed\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));

MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break;

default:
/*
Other WM_DEVICECHANGE notifications get sent for other devices
or reasons; we don't care about them here. If they were
important, we would check for them and act accordingly.
*/
;
}
}


/*----------------------------------------------------------------------
FirstDriveFromMask (unitmask)

Finds the first valid drive letter from a mask of drive letters. The
mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C, etc.

A valid drive letter is defined when the corresponding bit is set to
1.

Returns the drive letter that was first found.
----------------------------------------------------------------------*/
char FirstDriveFromMask (ULONG unitmask)
{
char i;

for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}

return (i + 'A');
}

Aunque este código de ejemplo sólo comprueba las llegadas de volumen debido a la inserción de nuevos medios, puede ampliarse para obtener notificaciones de otros eventos de hardware para otros tipos de demasiado. Para ello, deberá agregar los casos de otros eventos del dispositivo y controlar distintos tipos de dispositivos para cada evento.

Referencias

Documentación de Microsoft Platform SDK, visión general de "Administración de dispositivos" "capítulo
Propiedades

Id. de artículo: 163503 - Última revisión: 01/23/2017 - Revisión: 1

Comentarios