Mafa Dev

WM_DEVICECHANGE (착탈) 메시지 본문

개발/USB

WM_DEVICECHANGE (착탈) 메시지

마파_ 2013. 2. 17. 17:40

 

   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));  //나머지는 커널에서 처리하도록 메시지 전달
}