Mafa Dev

[WM_DEVICECHANGE 이벤트 종류] 본문

개발/USB

[WM_DEVICECHANGE 이벤트 종류]

마파_ 2013. 2. 17. 05:59

이벤트

설명

DBT_CONFIGCHANGECANCELED 현재의 구성에 대한 변경요구가 취소됐다.
DBT_CONFIGCHANGED 도크 또는 도크해제의 결과 현재의 구성이 변경됐다.
DBT_CUSTOMEVENT 커스텀 이벤트가 발생하다.
DBT_DEVICEARRIVAL 디바이스가 삽입돼 이용 가능하게 됐다.
DBT_DEVICEQUERYREMOVE 디바이스 제거 허가가 요청되다. 어플리케이션은 이 요구를 거부하고 제거를 취소시키는 것이 가능하다.
DBT_DEVICEQUERYREMOVEFAILED 디바이스의 제거요구가 취소됐다.
DBT_DEVICEREMOVEPENDING 디바이스가 제거되도록 하고 있다. 거부는 할수 없다.
DBT_DEVICEREMOVECOMPLETE 디바이스가 제거됐다.
DBT_DEVICETYPESPECIFIC 디바이스 고유의 이벤트가 발생했다.
DBT_QUERYCHANGECONFIG 현재의 구성을 변경하는 허가가 요청됐다.
DBT_DEVNODES_CHANGED 디바이스 트리가 변경됐다.
DBT_USERDEFINED 사용자가 정의한 이벤트가 발생했다.

 

USB와 같은 PnP 디바이스들은 윈도우에서 제공해 주는 WM_DEVICECHANGE를 통해서 삽입, 제거를 알 수가 있습니다.

WM_DEVICECHANGE에 대한 사용 방법을 알아 보겠습니다.

[WM_DEVICECHANGE 사용 방법]

// GUID 등록

DEV_BROADCAST_DEVICEINTERFACE broadcastInterface;

broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
broadcastInterface.dbcc_classguid = GUID_DEVINTERFACE_LIST[0];


gNotifyDevHandle = RegisterDeviceNotification(hWnd, &broadcastInterface,DEVICE_NOTIFY_WINDOW_HANDLE);

// 해당 드라이버 로드/언로드시 호출된 Callback 함수

LRESULT USBDetect::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DEVICECHANGE:
USBDeviceChange(wParam, lParam);
break;
}

return CWnd::DefWindowProc(message, wParam, lParam);
}

// 로드/언로드된 디바이스의 PID/VID로 장치 구별 처리

BOOL USBDetect::USBDeviceChange(UINT uEvent, DWORD dwEventData)
{
char *szDest = NULL;
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwEventData;

switch (uEvent)
{
case DBT_DEVICEARRIVAL:
if(lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE lpdb = (PDEV_BROADCAST_DEVICEINTERFACE)dwEventData;

for (int i = 0; i < DEVICE_NUM; i++)
{
szDest = strstr(lpdb->dbcc_name, );
if (NULL != szDest)
break;
}

if (NULL != szDest)
{

}

if( (DeviceName.CompareNoCase(m_USB.functionClassDeviceData->DevicePath)) == 0 )
{
}
else
{
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE lpdb = (PDEV_BROADCAST_DEVICEINTERFACE)dwEventData;

DeviceName = lpdb->dbcc_name;

if( (DeviceName.CompareNoCase(m_USB.functionClassDeviceData->DevicePath)) == 0 )
{
}
else
{
}
}
break;

default:
m_bUSBInserted = FALSE;
m_bUSBRemoved = FALSE;
break;
}

return TRUE;
}

// 등록 해제

UnregisterDeviceNotification(gNotifyDevHandle);