导语:
当有设备进入windows时,系统会向所有的应用层发送WM_DEVICECHANGE消息。进一步根据相应的事件判断设备。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam; switch (message) { //A device has been added to or removed from the system. case WM_DEVICECHANGE: if (/*DBT_DEVNODES_CHANGED*/DBT_DEVICEARRIVAL == wParam && lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv->dbcv_unitmask) { WCHAR wstrDrive = FirstDriveFromMask(lpdbv->dbcv_unitmask); wstring wstrMsg; wstrMsg.append(&wstrDrive); wstrMsg = wstrMsg.substr(0, 1); wstrMsg.append(L": arrived. "); MessageBoxW(hWnd, wstrMsg.c_str(), L"", MB_OK); } } if (DBT_DEVICEREMOVECOMPLETE == wParam && lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv->dbcv_unitmask) { WCHAR wstrDrive = FirstDriveFromMask(lpdbv->dbcv_unitmask); wstring wstrMsg; wstrMsg.append(&wstrDrive); wstrMsg = wstrMsg.substr(0, 1); wstrMsg.append(L": leave. "); MessageBoxW(hWnd, wstrMsg.c_str(), L"", MB_OK); } } //根据掩码判断盘符 WCHAR FirstDriveFromMask(ULONG unitmask) { char i; for (i = 0; i < 26; ++i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return(i + L'A'); } 如果要在MFC中响应此消息:需要重载虚函数:WindowProc 别忘了#include <Dbt.h>
相关链接:
https://msdn.microsoft.com/en-us/library/aa363480.aspx
https://msdn.microsoft.com/en-us/library/aa363205.aspx
https://msdn.microsoft.com/en-us/library/aa363431.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363215%28v=vs.85%29.aspx