다음을 통해 공유


미디어 삽입 또는 제거 감지

Windows는 새 디바이스 또는 미디어(예: CD 또는 DVD)가 추가되고 사용 가능해지고 기존 디바이스 또는 미디어가 제거될 때 모든 최상위 창 에 기본 WM_DEVICECHANGE 메시지 집합을 보냅니다. 이러한 기본 메시지를 수신하기 위해 등록할 필요가 없습니다. 기본적으로 전송되는 메시지에 대한 자세한 내용은 RegisterDeviceNotification 의 설명 섹션을 참조하세요. 아래 코드 예제의 메시지는 기본 메시지 중 하나입니다.

참고

Windows는 CD 또는 DVD 미디어 이벤트에 대한 WM_DEVICECHANGE 메시지만 활성 콘솔 세션에서 실행되는 애플리케이션이 소유한 최상위 창으로 보냅니다. 원격 데스크톱 세션에서 실행되는 애플리케이션이 소유한 최상위 창은 CD 또는 DVD 미디어 이벤트에 대한 WM_DEVICECHANGE 메시지를 수신하지 않습니다.

 

WM_DEVICECHANGE 메시지에는 변경 내용을 설명하는 연결된 이벤트와 변경 내용에 대한 자세한 정보를 제공하는 구조가 있습니다. 구조체는 이벤트 독립적 헤더, DEV_BROADCAST_HDR, 이벤트 종속 멤버로 구성됩니다. 이벤트 종속 멤버는 이벤트가 적용되는 디바이스를 설명합니다. 이 구조를 사용하려면 애플리케이션에서 먼저 이벤트 유형과 디바이스 유형을 결정해야 합니다. 그런 다음 올바른 구조를 사용하여 적절한 작업을 수행할 수 있습니다.

사용자가 드라이브에 새 CD 또는 DVD를 삽입하면 애플리케이션은 DBT_DEVICEARRIVAL 이벤트와 함께 WM_DEVICECHANGE 메시지를 받습니다. 애플리케이션은 도착하는 디바이스 유형이 볼륨(dbch_devicetype 멤버가 DBT_DEVTYP_VOLUME)이고 변경 내용이 미디어에 영향을 주도록(dbcv_flags 멤버가 DBTF_MEDIA) 이벤트를 검사 합니다.

사용자가 드라이브에서 CD 또는 DVD를 제거하면 애플리케이션은 DBT_DEVICEREMOVECOMPLETE 이벤트와 함께 WM_DEVICECHANGE 메시지를 받습니다. 다시 말하지만, 애플리케이션은 제거되는 디바이스가 볼륨이고 변경 내용이 미디어에 영향을 주도록 이벤트를 검사 합니다.

다음 코드는 CD 또는 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' );
}

디바이스 이벤트