基于windows消息的响应USB插入或取出

导语:
当有设备进入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

posted on 2018-10-09 11:34  priarieNew  阅读(991)  评论(0编辑  收藏  举报

导航