USB 장치가 연결되거나 해제 됐을 때는 이벤트를 처리하는 방법을 여기 저기 찾아 보다가 대충 적어봅니다.
1. 메시지 맵 등록
메시지 맵에 이벤트를 함수와 연결 시킨다.
BEGIN_MESSAGE_MAP(CDlg, CDialog)
ON_MESSAGE(WM_DEVICECHANGE, fnDeviceChange)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CDlg, CDialog)
ON_MESSAGE(WM_DEVICECHANGE, fnDeviceChange)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CDlg, CDialog) ON_MESSAGE(WM_DEVICECHANGE, fnDeviceChange) END_MESSAGE_MAP()
2. 이벤트를 받을 장치를 등록한다.
장치 등록은 RegisterForDeviceNotifications()함수를 이용한다
void CDlg::RegisterForDeviceNotifications()
{
DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
HDEVNOTIFY DeviceNotificationHandle;
DevBroadcastDeviceInterface.dbcc_size = sizeof(DevBroadcastDeviceInterface);
DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevBroadcastDeviceInterface.dbcc_classguid = DeviceGuid; /* 해당 장치의 GUID */
DeviceNotificationHandle =
RegisterDeviceNotification(m_hWnd, &DevBroadcastDeviceInterface,
DEVICE_NOTIFY_WINDOW_HANDLE);
}
void CDlg::RegisterForDeviceNotifications()
{
DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
HDEVNOTIFY DeviceNotificationHandle;
DevBroadcastDeviceInterface.dbcc_size = sizeof(DevBroadcastDeviceInterface);
DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevBroadcastDeviceInterface.dbcc_classguid = DeviceGuid; /* 해당 장치의 GUID */
DeviceNotificationHandle =
RegisterDeviceNotification(m_hWnd, &DevBroadcastDeviceInterface,
DEVICE_NOTIFY_WINDOW_HANDLE);
}
void CDlg::RegisterForDeviceNotifications() { DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface; HDEVNOTIFY DeviceNotificationHandle; DevBroadcastDeviceInterface.dbcc_size = sizeof(DevBroadcastDeviceInterface); DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; DevBroadcastDeviceInterface.dbcc_classguid = DeviceGuid; /* 해당 장치의 GUID */ DeviceNotificationHandle = RegisterDeviceNotification(m_hWnd, &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE); }
3. 처리함수 구현
처리함수는 WM_DEVICECHANGE에서 넘어오는 파라메터를 이용해서 한다 자세한 파라메터 정보는 MSDN을 참조하시기 바랍니다.
void CDlg::fnDeviceChange(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case DBT_DEVICEARRIVAL:
/* 장치 연결 됬을 때 처리 */
break;
case DBT_DEVICEREMOVECOMPLETE:
/* 장치 연결 해제 됬을 때 처리 */
break;
default:
break;
}
}
void CDlg::fnDeviceChange(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case DBT_DEVICEARRIVAL:
/* 장치 연결 됬을 때 처리 */
break;
case DBT_DEVICEREMOVECOMPLETE:
/* 장치 연결 해제 됬을 때 처리 */
break;
default:
break;
}
}
void CDlg::fnDeviceChange(WPARAM wParam, LPARAM lParam) { switch(wParam) { case DBT_DEVICEARRIVAL: /* 장치 연결 됬을 때 처리 */ break; case DBT_DEVICEREMOVECOMPLETE: /* 장치 연결 해제 됬을 때 처리 */ break; default: break; } }