Mafa Dev
[WM_DEVICECHANGE 이벤트 종류] 본문
이벤트 |
설명 |
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);
'개발 > USB' 카테고리의 다른 글
USB로 exe 자동실행 소스 (0) | 2013.02.21 |
---|---|
getdrive ( 최근의 드라이버 불러오는 함수) (0) | 2013.02.18 |
WinExec ( 프로세서에서 외부 프로세스 실행하기 ) (0) | 2013.02.17 |
WM_DEVICECHANGE (착탈) 메시지 (0) | 2013.02.17 |