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.