CD-ROM 삽입 또는 제거 알림을 받는 방법

일부 애플리케이션은 사용자가 미디어 변경 내용을 폴링하지 않고 CD-ROM 드라이브에서 압축 디스크 또는 DVD를 삽입하거나 제거하는 시기를 알아야 합니다. Windows는 메시지를 통해 WM_DEVICECHANGE 이러한 애플리케이션에 알리는 방법을 제공합니다. 이 문서에서는 CD-ROM 또는 DVD 미디어 변경 내용을 검색하기 위해 메시지를 처리하는 WM_DEVICECHANGE 방법을 설명합니다.

원래 제품 버전: Windows
원래 KB 번호: 163503

Windows 알림

Windows는 새 디바이스 또는 미디어를 추가하고 사용할 수 있게 되고 기존 디바이스 또는 미디어가 제거될 때 모든 최상위 창 WM_DEVICECHANGE 에 메시지를 보냅니다. 각 WM_DEVICECHANGE 메시지에는 변경 내용을 설명하는 이벤트와 변경 내용에 대한 자세한 정보를 제공하는 구조가 있습니다.

구조체는 이벤트 독립적 헤더와 이벤트 종속 구조로 구성됩니다. 구조체의 이벤트 종속 부분은 이벤트가 적용되는 디바이스를 설명합니다. 이 구조를 사용하려면 애플리케이션에서 먼저 이벤트 유형과 디바이스 유형을 결정해야 합니다. 그런 다음 올바른 구조를 사용하여 적절한 조치를 취할 수 있습니다.

사용자가 드라이브에 새 압축 디스크 또는 DVD를 삽입하면 애플리케이션은 이벤트와 함께 메시지를 받 WM_DEVICECHANCE 습니다 DBT_DEVICEARRIVAL . 애플리케이션은 도착하는 디바이스 유형이 볼륨()이고 이벤트의 미디어 플래그(DBT_DEVTYP_VOLUMEDBTF_MEDIA)가 설정되어 있는지 확인하기 위해 이벤트를 검사 합니다.

사용자가 CD-ROM 드라이브 또는 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');
}

이 샘플 코드는 새 미디어 삽입으로 인해 볼륨 도착만 확인하지만 다른 형식에 대한 다른 하드웨어 이벤트 알림을 받도록 확장할 수 있습니다. 이렇게 하려면 다른 디바이스 이벤트에 대한 사례를 추가하고 각 이벤트에 대해 서로 다른 디바이스 유형을 처리해야 합니다.