Erkennen des Einfügens oder Entfernens von Medien

Windows sendet allen Fenstern der obersten Ebene eine Reihe von Standardnachrichten WM_DEVICECHANGE , wenn neue Geräte oder Medien (z. B. eine CD oder DVD) hinzugefügt und verfügbar werden, und wenn vorhandene Geräte oder Medien entfernt werden. Sie müssen sich nicht registrieren, um diese Standardnachrichten zu empfangen. Weitere Informationen zu den standardmäßig gesendeten Nachrichten finden Sie im Abschnitt Hinweise unter RegisterDeviceNotification . Die Meldungen im folgenden Codebeispiel gehören zu den Standardmeldungen.

Hinweis

Windows sendet nur WM_DEVICECHANGE Nachrichten für CD- oder DVD-Medienereignisse an Fenster der obersten Ebene, die sich im Besitz von Anwendungen befinden, die in der aktiven Konsolensitzung ausgeführt werden. Fenster der obersten Ebene, die im Besitz von Anwendungen sind, die in einer Remotedesktopsitzung ausgeführt werden, erhalten keine WM_DEVICECHANGE Nachrichten für CD- oder DVD-Medienereignisse.

 

Jede WM_DEVICECHANGE Nachricht verfügt über ein zugeordnetes Ereignis, das die Änderung beschreibt, und eine Struktur, die detaillierte Informationen zur Änderung bereitstellt. Die Struktur besteht aus einem ereignisunabhängigen Header , DEV_BROADCAST_HDR, gefolgt von ereignisabhängigen Membern. Die ereignisabhängigen Member beschreiben das Gerät, für das das Ereignis gilt. Um diese Struktur verwenden zu können, müssen Anwendungen zuerst den Ereignistyp und den Gerätetyp bestimmen. Anschließend können sie die richtige Struktur verwenden, um geeignete Maßnahmen zu ergreifen.

Wenn der Benutzer eine neue CD oder DVD in ein Laufwerk einfügt, erhalten Anwendungen eine WM_DEVICECHANGE Nachricht mit einem DBT_DEVICEARRIVAL Ereignis. Die Anwendung muss das Ereignis überprüfen, um sicherzustellen, dass es sich bei dem Typ des eintreffenden Geräts um ein Volume handelt (der dbch_devicetype Member ist DBT_DEVTYP_VOLUME) und dass sich die Änderung auf die Medien auswirkt (der dbcv_flags Member ist DBTF_MEDIA).

Wenn der Benutzer eine CD oder DVD von einem Laufwerk entfernt, erhalten Anwendungen eine WM_DEVICECHANGE Nachricht mit einem DBT_DEVICEREMOVECOMPLETE Ereignis. Auch hier muss die Anwendung das Ereignis überprüfen, um sicherzustellen, dass es sich bei dem zu entfernenden Gerät um ein Volume handelt und sich die Änderung auf die Medien auswirkt.

Der folgende Code veranschaulicht, wie Sie nach dem Einfügen oder Entfernen einer CD oder DVD suchen.

#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' );
}

Geräteereignisse