본문 바로가기
VisualStudio.C++.C#/코딩팁,함수활용,단편

USB 연결/분리 검출, WM_DEVICECHANGE, OnDeviceChange, RegisterDeviceNotification,dht.h,

by 리치굿맨 2016. 1. 30.

 

 

개요

 

PC 프로그램에서 USB 장치 연결, 분리등 장치 상태변경 감지 하기 위한 메시지 처리 방법. USB뿐만 아니라 Plug&Play 장치들에 모두 적용가능함.

 

구현방법 요점.

운영체제는 장치변경시 윈도우의 모든 응용프로그램(정확하게는 Top-level Window) 측으로 메시지 아이디 WM_DEVICECHANGE 를 전송하므로 이를 수신처리하면 되나, Visual C++ 의 클래스 위저드에서 WM_DEVICECHANGE 처리기 자동추가 기능 제공 안하므로 수동으로 코드 추가 해서 메시지 수신처리한다. 


1. 운영체제에서 메시지 아이디 WM_DEVICECHANGE로  모든 application 측으로 장치연결, 분리 등의 상태변경 메시지를  전송한다.

2. 수동으로 WM_DEVICECHANGE 받기위한 메시지핸들러 추가한다.

- 이때 3가지 방식 가능 (1) OnDeviceChange(UINT nEventType, DWORD) 추가, (2) WindowProc 추가,(3) DefWindowProc 추가.

3. 메시지 핸들러 내에서 수신된 이벤트 데이터로부터 연결인지 분리인지 확인.  <- 이를 위해 dbt.h 를 include해야함.

- OnDeviceChange 인 경우 1번 인자로 전달된 nEventType,


응용프로그램 측에서 특정기기클래스를 지정하지 않은 경우에는 WM_DEVICECHANGE는 port (시리얼 , 패러랠포트)와 Volume(디스크)  에 대해서만 기기의 제거/분리 (DBT_DEVICEARRIVAL / DBT_DEVICEREMOVECOMPLETE) 정보가 제공되며, 그 외의 장치에 대해서는 "뭔가 변화되었다" 수준의 정보만 알려준다. 포트와 디스크 가 아닌 장치에 대하여 제거/분리 상태를 명확히 검출하려면 RegisterDeviceNotification 함수 호출하여 수신받고자 하는 장치 GUID 를 전달해야 한다.  표준 장치클래스별 모든 GUID 는 여기 -> http://igotit.tistory.com/640

 


 

 

 

 

 

 


 

WM_DEVICECHANGE 메시지 수신 코드

 

방법1.

기기 상태변경시 우리의 코드에서  WM_DEVICECHANGE 수신하기 위한 코드처리로 가장 간단한 방식은 메시지맵에 WM_DEVICECHANGE 를 수신하겠다는 설정 추가하고 메시지 핸들러 함수 수동 추가한다.


메시지맵 수동추가. - 아래 붉은선 부분.


메시지 핸들러 함수 추가.


오타정정. 하기 코드에서 인자 자료형 DWORD는 DWORD_PTR 로 해야함.

 

 


 


 본 글이 포함된 상위 정리 장소.

 

 1. Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11


 2. Connectivity 의 USB -> http://igotit.tistory.com/280

 

  


///639.

태그

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT