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 함수를
오버라이드 하셔서 잡으셔야 합니다.

void DrawImage(HDC hdc)
{
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
RECT rc = { 좌표 };

// Normally you would only call CoInitialize/CoUninitialize
// once per thread. This sample calls CoInitialize in this
// draw function simply to illustrate that you must call
// CoInitialize before calling CoCreateInstance.
CoInitializeEx(NULL, COINIT_MULTITHREADED);

// Create the imaging factory.
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)
))
{
// Load the image from the JPG file.
if (SUCCEEDED(pImgFactory->CreateImageFromFile(
TEXT("이미지 경로"),
&pImage)))
{
// Draw the image.
pImage->Draw(hdc, &rc, NULL);
pImage->Release();
}

pImgFactory->Release();
}
CoUninitialize();
}

+ Recent posts