Поймать WM_DEVICECHANGE из любого дескриптора окна, зарегистрировавшись для уведомлений об изменении устройства. Как таковой:
DEV_BROADCAST_DEVICEINTERFACE dbd = { sizeof(dbd) };
dbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
dbd.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
RegisterDeviceNotification(hwnd, &dbd, DEVICE_NOTIFY_WINDOW_HANDLE);
lParam WM_DEVICECHANGE может быть приведен к DBT_DEVTYP_DEVICEINTERFACE. Примечание: при подключении устройства вы можете получить несколько уведомлений WM_DEVICECHANGE. Просто отфильтруйте событие прибытия и игнорируйте дубликаты.
LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(hwnd)
{
case WM_DEVICE_CHANGE:
{
PDEV_BROADCAST_HDR pHdr = NULL;
PDEV_BROADCAST_DEVICEINTERFACE pDev = NULL;
pHdr = (PDEV_BROADCAST_HDR)lParam;
bool fDeviceArrival = (wParam == DBT_DEVICEARRIVAL);
if (fDeviceArrival)
{
if (pHdr && (pHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE))
{
pDev = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
}
if (pDev && (pDev->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE))
{
// the PNP string of the device just plugged is in dbcc_name
OutputDebugString(pDev->dbcc_name);
OutputDebugString("\r\n");
}
}
....