检测cd卡usb等

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值