Condividi tramite


Rilevamento dell'inserimento o della rimozione di supporti

Windows invia a tutte le finestre di primo livello un set di messaggi di WM_DEVICECHANGE predefiniti quando vengono aggiunti nuovi dispositivi o supporti (ad esempio un CD o DVD) e diventano disponibili e quando vengono rimossi i dispositivi o i supporti esistenti. Non è necessario registrarsi per ricevere questi messaggi predefiniti. Per informazioni dettagliate sui messaggi inviati per impostazione predefinita, vedere la sezione Osservazioni in RegisterDeviceNotification. I messaggi nell'esempio di codice seguente sono tra i messaggi predefiniti.

Nota

Windows invia solo WM_DEVICECHANGE messaggi per eventi multimediali CD o DVD a finestre di primo livello di proprietà delle applicazioni eseguite nella sessione della console attiva. Le finestre di primo livello di proprietà delle applicazioni eseguite in una sessione desktop remoto non ricevono WM_DEVICECHANGE messaggi per eventi multimediali CD o DVD.

 

Ogni WM_DEVICECHANGE messaggio ha un evento associato che descrive la modifica e una struttura che fornisce informazioni dettagliate sulla modifica. La struttura è costituita da un'intestazione indipendente dall'evento, DEV_BROADCAST_HDR, seguita da membri dipendenti dall'evento. I membri dipendenti dall'evento descrivono il dispositivo a cui si applica l'evento. Per usare questa struttura, le applicazioni devono prima determinare il tipo di evento e il tipo di dispositivo. Possono quindi usare la struttura corretta per intervenire in modo appropriato.

Quando l'utente inserisce un nuovo CD o DVD in un'unità, le applicazioni ricevono un messaggio di WM_DEVICECHANGE con un evento DBT_DEVICEARRIVAL. L'applicazione deve controllare l'evento per assicurarsi che il tipo di dispositivo in arrivo sia un volume (il membro dbch_devicetype è DBT_DEVTYP_VOLUME) e che la modifica influisca sul supporto (il membro dbcv_flags è DBTF_MEDIA).

Quando l'utente rimuove un CD o UN DVD da un'unità, le applicazioni ricevono un messaggio di WM_DEVICECHANGE con un evento DBT_DEVICEREMOVECOMPLETE. Anche in questo caso, l'applicazione deve controllare l'evento per assicurarsi che il dispositivo rimosso sia un volume e che la modifica influisca sul supporto.

Il codice seguente illustra come verificare la presenza di inserimento o rimozione di un CD o DVD.

#include <windows.h>
#include <dbt.h>
#include <strsafe.h>
#pragma comment(lib, "user32.lib" )

void Main_OnDeviceChange( HWND hwnd, WPARAM wParam, LPARAM lParam );
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;
  TCHAR szMsg[80];

  switch(wParam )
   {
    case DBT_DEVICEARRIVAL:
      // Check whether a CD 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)
         {
          StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]), 
                           TEXT("Drive %c: Media has arrived.\n"), 
                           FirstDriveFromMask(lpdbv ->dbcv_unitmask) );

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

    case DBT_DEVICEREMOVECOMPLETE:
      // Check whether a CD or DVD 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)
         {
          StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]), 
                           TEXT("Drive %c: Media was removed.\n" ),
                           FirstDriveFromMask(lpdbv ->dbcv_unitmask) );

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

    default:
      /*
        Process other WM_DEVICECHANGE notifications for other 
        devices or reasons.
      */ 
      ;
   }
}

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

   Description
     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 2 = C, 
     and so on. A valid drive letter is defined when the 
     corresponding bit is set to 1.

   Returns the first drive letter that was found.
--------------------------------------------------------------------*/

char FirstDriveFromMask( ULONG unitmask )
 {
  char i;

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

  return( i + 'A' );
}

Eventi del dispositivo