Come ricevere la notifica dell'inserimento o della rimozione di CD-ROM
Alcune applicazioni devono sapere quando l'utente inserisce o rimuove un CD o un DVD da un'unità CD-ROM senza eseguire il polling delle modifiche ai supporti. Windows consente di inviare notifiche a queste applicazioni tramite il WM_DEVICECHANGE
messaggio. Questo articolo illustra come gestire il WM_DEVICECHANGE
messaggio per rilevare le modifiche ai supporti CD-ROM o DVD.
Versione originale del prodotto: Windows
Numero KB originale: 163503
Notifica di Windows
Windows invia a tutte le finestre di primo livello un WM_DEVICECHANGE
messaggio quando vengono aggiunti nuovi dispositivi o supporti e diventano disponibili e quando vengono rimossi i dispositivi o i supporti esistenti. A ogni WM_DEVICECHANGE
messaggio è associato un evento per descrivere la modifica e una struttura che fornisce informazioni dettagliate sulla modifica.
La struttura è costituita da un'intestazione indipendente dall'evento seguita da una struttura dipendente dagli eventi. La parte dipendente dagli eventi della struttura descrive il dispositivo a cui si applica l'evento. Per usare questa struttura, le applicazioni devono innanzitutto determinare il tipo di evento e il tipo di dispositivo. Quindi, possono usare la struttura corretta per intraprendere l'azione appropriata.
Quando l'utente inserisce un nuovo COMPACT DISC o DVD in un'unità, le applicazioni ricevono un WM_DEVICECHANCE
messaggio con un DBT_DEVICEARRIVAL
evento. L'applicazione deve controllare l'evento per assicurarsi che il tipo di dispositivo in arrivo sia un volume (DBT_DEVTYP_VOLUME
) e che sia impostato il flag multimediale dell'evento (DBTF_MEDIA
).
Quando l'utente rimuove un compact disc da un'unità CD-ROM o un DVD, le applicazioni riceveranno un WM_DEVICECHANCE
messaggio con un DBT_DEVICEREMOVECOMPLETE
evento. Come in DBT_DEVICEARRIVAL
precedenza, l'applicazione deve controllare l'evento per assicurarsi che il dispositivo rimosso sia un volume e che il flag multimediale dell'evento sia impostato.
Codice di esempio
Il codice seguente illustra come usare il messaggio per verificare l'inserimento WM_DEVICECHANGE
o la rimozione di compact disc o DVD.
#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');
}
Anche se questo codice di esempio controlla solo gli arrivi del volume a causa dell'inserimento di nuovi supporti, può essere esteso per ottenere la notifica di altri eventi hardware anche per altri tipi. A tale scopo, è necessario aggiungere case per altri eventi del dispositivo e gestire tipi di dispositivo diversi per ogni evento.