Mafa Dev
WM_DEVICECHANGE (착탈) 메시지 본문
1.WM_DEVICECHANGE 이벤트를 사용하려면?? |
SD혹은 USB장치 등이 단말기로부터 분리되면 , 시스템은 윈도우에 WM_DEVICECHANGE 메시지를 전달합니다. API 프로그래밍 에서는 PreTranslateMessage 에서 사용하면 되지만 MFC에서는 PreTranslateMessage에서 잡히지 않습니다. DefWinProc에서 잡아주시거나 혹은 ON_WM_DEVICECHANGE() 매크로를 이용하여 잡아야 합니다. 현재 비주얼 스튜디오에서는 위의 매크로를 지원 해주기 때문에 바로 사용 할수 있으나 , EVC (Visual Studio같은 컴파일러 프로그램) 에서는 메시지가 정의되어 있지 않으므로 상수값을 지정해 주거나 따로 정의하여 쓰셔야 합니다.
2. 메시지 핸들러 설치하는 방법 |
1 . Dialog의 cpp파일에서 MESSAGE_MAP에 아래와 같이 한줄을 추가합니다.
======================== safeDlg.cpp ======================
( 저는 프로젝트를 safe라는 이름으로 만들었기 때문에 safeDlg입니다 자신의 xxxDlg.cpp 이름을 기록하시면 됩니다. )
노란 네모 박스 부분을 찾아서 저부분에 빨간색 네모 박스의 ON_WM_DEVICECHANGE() 부분을 입력 시켜주시면 됩니다.
2. Dialog의 h 파일에 다음과 같이 함수(메소드) 를 선언해 줍니다.
===================== safeDlg.h =========================
3. Dialog의 cpp 파일에서 OnDeviceChange method 를 구현한다.
===================== safeDlg.cpp =========================
간단하게 작성 시킨 WM_DEVICECHAGE 메시지 핸들러입니다.
USB가 연결되었을 시 "USB장치 연결" 이라는 메시지가, USB해제 시 "USB장치 해제" 메시지가 뜨게 됩니다.
그리고 이벤트가 발생한 장치 라던가 이벤트의 종류가 어떤 것인지 판단 할 수 있습니다. sStorage 에는 "DKS1:" 등의 이름이 들어가게 됩니다. 이렇게 찰탁된 장치 드라이버의 이름을 얻게 됩니다.
API프로그래밍에서 사용할시에는 꼭 Dbt.h 파일을 추가하고
UINT event = (UINT)wParam;
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HANDLE hThread1=0;
HANDLE hThread2=0;
UINT event = (UINT)wParam;
//DWORD id_1,id_2,id_3,id_4;
switch(iMsg)
{
case WM_CREATE:
{
Sleep(50);
_beginthreadex(NULL,0,USBcheck,0,0,NULL);
_beginthreadex(NULL,0,ThreadF,0,0,NULL);
}
case WM_DEVICECHANGE:
switch (event)
{
case DBT_DEVICEARRIVAL:
MessageBox(NULL , "hi","test2",MB_OK);
break;
case DBT_DEVICEREMOVECOMPLETE:
MessageBox(NULL , "by~","test1",MB_OK);
default:
break;
}
return 0;
}
return (DefWindowProc(hwnd, iMsg, wParam, lParam)); //나머지는 커널에서 처리하도록 메시지 전달
}
'개발 > USB' 카테고리의 다른 글
USB로 exe 자동실행 소스 (0) | 2013.02.21 |
---|---|
getdrive ( 최근의 드라이버 불러오는 함수) (0) | 2013.02.18 |
WinExec ( 프로세서에서 외부 프로세스 실행하기 ) (0) | 2013.02.17 |
[WM_DEVICECHANGE 이벤트 종류] (0) | 2013.02.17 |