Détection de l’insertion ou de la suppression d’un média

Windows envoie à toutes les fenêtres de niveau supérieur un ensemble de messages de WM_DEVICECHANGE par défaut lorsque de nouveaux appareils ou médias (tels qu’un CD ou DVD) sont ajoutés et deviennent disponibles, et lorsque des appareils ou des supports existants sont supprimés. Vous n’avez pas besoin de vous inscrire pour recevoir ces messages par défaut. Pour plus d’informations sur les messages envoyés par défaut, consultez la section Notes dans RegisterDeviceNotification . Les messages de l’exemple de code ci-dessous figurent parmi les messages par défaut.

Notes

Windows envoie uniquement des messages WM_DEVICECHANGE pour les événements multimédias CD ou DVD aux fenêtres de niveau supérieur appartenant aux applications qui s’exécutent dans la session de console active. Les fenêtres de niveau supérieur appartenant aux applications qui s’exécutent dans une session Bureau à distance ne reçoivent pas de messages WM_DEVICECHANGE pour les événements multimédias CD ou DVD.

 

Chaque message WM_DEVICECHANGE a un événement associé qui décrit la modification et une structure qui fournit des informations détaillées sur la modification. La structure se compose d’un en-tête indépendant des événements, DEV_BROADCAST_HDR, suivi de membres dépendants des événements. Les membres dépendants des événements décrivent l’appareil auquel l’événement s’applique. Pour utiliser cette structure, les applications doivent d’abord déterminer le type d’événement et le type d’appareil. Ensuite, ils peuvent utiliser la structure appropriée pour prendre les mesures appropriées.

Lorsque l’utilisateur insère un nouveau CD ou DVD dans un lecteur, les applications reçoivent un message WM_DEVICECHANGE avec un événement DBT_DEVICEARRIVAL . L’application doit case activée l’événement pour s’assurer que le type d’appareil arrivant est un volume (le membre dbch_devicetype est DBT_DEVTYP_VOLUME) et que la modification affecte le média (le membre dbcv_flags est DBTF_MEDIA).

Lorsque l’utilisateur supprime un CD ou un DVD d’un lecteur, les applications reçoivent un message WM_DEVICECHANGE avec un événement DBT_DEVICEREMOVECOMPLETE . Là encore, l’application doit case activée l’événement pour s’assurer que l’appareil en cours de suppression est un volume et que la modification affecte le média.

Le code suivant montre comment case activée pour l’insertion ou la suppression d’un CD ou d’un 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' );
}

Événements de l'appareil