Обнаружение вставки или удаления носителей

Windows отправляет все окна верхнего уровня набор сообщений по умолчанию WM_DEVICECHANGE , когда добавляются новые устройства или носители (например, компакт-диск или DVD-диск), а также при удалении существующих устройств или носителей. Вам не нужно регистрировать эти сообщения по умолчанию. Дополнительные сведения о том, какие сообщения отправляются по умолчанию, см. в разделе "Примечания" в registerDeviceNotification. Сообщения в приведенном ниже примере кода являются одними из сообщений по умолчанию.

Примечание.

Windows отправляет только WM_DEVICECHANGE сообщения для событий мультимедиа CD или DVD в окна верхнего уровня, принадлежащие приложениям, выполняющимся в активном сеансе консоли. Окна верхнего уровня, принадлежащие приложениям, которые выполняются в сеансе удаленного рабочего стола, не получают WM_DEVICECHANGE сообщения для событий мультимедиа CD или DVD.

 

Каждое сообщение WM_DEVICECHANGE содержит связанное событие, описывающее изменение, и структуру, которая предоставляет подробные сведения об изменении. Структура состоит из заголовка, независимого от событий, DEV_BROADCAST_HDR, за которым следуют члены, зависящие от событий. Члены, зависящие от событий, описывают устройство, к которому применяется событие. Чтобы использовать эту структуру, приложения должны сначала определить тип события и тип устройства. Затем они могут использовать правильную структуру для принятия соответствующих действий.

Когда пользователь вставляет новый компакт-диск или DVD-диск, приложения получают WM_DEVICECHANGE сообщение с событием DBT_DEVICEARRIVAL . Приложение должно проверка событие, чтобы убедиться, что тип устройства, поступающий, является томом (элемент dbch_devicetype DBT_DEVTYP_VOLUME), и что изменение влияет на носитель (элемент dbcv_flags DBTF_MEDIA).

Когда пользователь удаляет компакт-диск или DVD-диск, приложения получают сообщение WM_DEVICECHANGE с событием DBT_DEVICEREMOVECOMPLETE. Опять же, приложение должно проверка событие, чтобы убедиться, что удаленное устройство является томом, и что изменение влияет на носитель.

В следующем коде показано, как проверка для вставки или удаления компакт-диска или 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' );
}

События устройства