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