Visual Studio 에서는 WM_DEVICECHANGE 및 관련 상수들이 정의되어 있으나,
EVC 에서는 정의되어 있지 않아서 따로 상수를 정의해서 쓰셔야 합니다.
Visual Studio SDK 에서 가져온 상수 및 기본 사용법입니다.
//////////////////////////////////////////////////////////////////////
// 정의 부분 (EVC 로 작성시에만 필요)
//////////////////////////////////////////////////////////////////////
/*
* BroadcastSpecialMessage constants.
*/
#define WM_DEVICECHANGE 0x0219
/*
* The following messages are for WM_DEVICECHANGE. The immediate list
* is for the wParam. ALL THESE MESSAGES PASS A POINTER TO A STRUCT
* STARTING WITH A DWORD SIZE AND HAVING NO POINTER IN THE STRUCT.
*/
#define DBT_DEVICEARRIVAL 0x8000 // system detected a new device
#define DBT_DEVICEREMOVECOMPLETE 0x8004 // device is gone
#define DBT_DEVTYP_PORT 0x00000003 // serial, parallel
/*
* Device broadcast header
*/
struct _DEV_BROADCAST_HDR { /* */
DWORD dbch_size;
DWORD dbch_devicetype;
DWORD dbch_reserved;
};
typedef struct _DEV_BROADCAST_HDR DEV_BROADCAST_HDR;
typedef DEV_BROADCAST_HDR *PDEV_BROADCAST_HDR;
//////////////////////////////////////////////////////////////////////
// 메시지 핸들러에서의 사용
//////////////////////////////////////////////////////////////////////
switch(message)
{
case WM_DEVICECHANGE:
PDEV_BROADCAST_HDR lpdb;
switch(wParam) //device-change event
{
case DBT_DEVICEARRIVAL:
lpdb = (PDEV_BROADCAST_HDR) lParam;
if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT)
{
// SD 카드 인식
}
break;
case DBT_DEVICEREMOVECOMPLETE:
lpdb = (PDEV_BROADCAST_HDR) lParam;
if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT)
{
// SD 카드 탈착
}
break;
}
break;
}
WM_DEVICECHANGE 메시지는 Win32 API 로 작성한 경우에는 WinProc 에서 잡을 수 있고,
MFC 기반 프로그램에서는 PreTranslateMessage 가 아닌 DefWindowProc 함수를
오버라이드 하셔서 잡으셔야 합니다.