Получение уведомлений о вставке или удалении компакт-диска

Некоторые приложения должны знать, когда пользователь вставляет или удаляет компакт-диск или DVD-диск с компакт-диска, не опрашивая об изменениях мультимедиа. Windows предоставляет способ уведомления этих приложений WM_DEVICECHANGE с помощью сообщения. В этой статье объясняется, как обработать WM_DEVICECHANGE сообщение для обнаружения изменений компакт-дисков или DVD-носителей.

Исходная версия продукта: Windows
Исходный номер базы знаний: 163503

Уведомление Windows

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

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

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

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

Пример кода

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

Хотя этот пример кода проверяет только поступление томов из-за вставки нового носителя, его можно расширить, чтобы получать уведомления о других событиях оборудования для других типов. Для этого необходимо добавить варианты для других событий устройства и обрабатывать различные типы устройств для каждого события.