#include <Pnp.h>
#include <msgqueue.h>
//定义DEVDETAIL联合体,目的为了DEVDETAIL结构体的szName变量的长度
typedef union {
DEVDETAIL d;
char pad[sizeof(DEVDETAIL)+MAX_DEVCLASS_NAMELEN];
} MYDEV;
//检测SD卡插拔状态的线程
UINT CRequestDeviceNotifications_TestDlg::SDCheckThread(LPVOID lpParam)
{
GUID guid = {0}; // or any known and relevant device interface GUID
HANDLE hQueue, hn;
MSGQUEUEOPTIONS msgopts;
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = 0;
msgopts.dwMaxMessages = 0;
msgopts.cbMaxMessage = sizeof(MYDEV);
msgopts.bReadAccess = TRUE;
//创建消息队列
hQueue = CreateMsgQueue(NULL, &msgopts);
if (hQueue == 0)
{
return 0;
}
//注册消息队列到设备管理器
hn = RequestDeviceNotifications(&FATFS_MOUNT_GUID, hQueue, TRUE);
MYDEV devDetail;
DWORD dwFlags;
DWORD dwSize;
for(;;)
{
//等待消息队列的返回
DWORD rel = ::WaitForSingleObject(hQueue, INFINITE);
if(rel == WAIT_OBJECT_0)
{
//读消息队列的数据,这里是读出很多消息的,因为有比较多的设备
while(::ReadMsgQueue(hQueue, &devDetail, sizeof(MYDEV), &dwSize, 0, &dwFlags) == TRUE)
{
//判断是否SD卡目录,这里可以增加其他判断,这样就可以变成检测其他设备
if(TEXT("//SD Memory") == devDetail.d.szName)
{
wprintf(L"ReadMsgQueue %s/r/n",devDetail.d.szName);
}
}
}
}
return 0;
}
下面是我自己用win下的检测方法:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
break;
case WM_CLOSE:
::ShowWindow(hWnd, 0);
break;
case WM_DEVICECHANGE:
if ( pEboxGUIDeviceChange==NULL)
break;
switch (wParam)
{
case DBT_DEVICEARRIVAL:
case DBT_DEVICEREMOVECOMPLETE:
{
DEV_BROADCAST_HDR* pDPH=(DEV_BROADCAST_HDR*)(lParam);
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lParam;
if ( pDPH->dbch_devicetype==2)
{
wchar_t sss=FirstDriveFromMask(lpdbv->dbcv_unitmask);
wchar_t szDrvName[256];
_stprintf_s( szDrvName, 256, _T("%c://"), sss );
UINT uDriveType=GetDriveType( szDrvName );
if ( uDriveType==DRIVE_CDROM )
{
pEboxGUIDeviceChange(sss, (wParam==DBT_DEVICEARRIVAL)?EBOX_CD_INPUT:EBOX_CD_OUTPUT);
break;
}
if ( uDriveType==DRIVE_REMOVABLE )
{
pEboxGUIDeviceChange(sss, (wParam==DBT_DEVICEARRIVAL)?EBOX_USB_INPUT:EBOX_USB_OUTPUT);
break;
}
else
pEboxGUIDeviceChange(sss, (wParam==DBT_DEVICEARRIVAL)?EBOX_USB_INPUT:EBOX_USB_OUTPUT);
}
}
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}