导语:
当有设备进入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.\n");
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.\n");
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