时间:2019-09-25 17:09
人气:
作者:admin
有时应用需要检查USB设备的加载与卸除消息,如U盘的插上与拔出。一种办法是以轮询的方式调用设备接口尝试访问设备,但这样的做法效率很低,并且实时性不高。本文将介绍更为通用的方法,通过系统API函数RequestDeviceNotifications,读取设备消息,获得设备加载及移除的消息。
查找设备IClass值
每个USB设备都有一个IClass值,相当于在系统里的编号,IClass值可以通过查询板子注册表获得。以U盘为例:

如图,[HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers]下存有所有USB设备类型的信息。Mass_Storage_Class即U盘的IClass值为{A4E7EDDA-E575-4252-9D6B-4195D48BB865}
用代码表示即
GUID guid = { 0xA4E7EDDA, 0xE575, 0x4252, { 0x9D, 0x6B, 0x41, 0x95, 0xD4, 0x8B, 0xB8, 0x65 } };
调用API监听设备消息
监听流程如下:
创建消息队列->绑定设备和消息队列->读取消息队列
以U盘为例,代码如下
MSGQUEUEOPTIONS msgopts;
//{A4E7EDDA-E575-4252-9D6B-4195D48BB865} 这个是USB storage的
GUID guid = { 0xA4E7EDDA, 0xE575, 0x4252, { 0x9D, 0x6B, 0x41, 0x95, 0xD4, 0x8B, 0xB8, 0x65 } };
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = 0;
msgopts.dwMaxMessages = 10; //?
msgopts.cbMaxMessage = sizeof(MYDEV);
msgopts.bReadAccess = TRUE;
HANDLE m_hReadMsgQ = CreateMsgQueue(NULL, &msgopts);
HANDLE hNotify;
DWORD ret;
hNotify = RequestDeviceNotifications(&guid, m_hReadMsgQ, TRUE);
flags = 0;
size = 0;
//while(true){
ret = WaitForSingleObject(m_hReadMsgQ, INFINITE);
if(ret == WAIT_OBJECT_0)
{
while (ReadMsgQueue(m_hReadMsgQ, &detail, sizeof(detail), &size, 1, &flags) == TRUE) //参数“1”表示1ms超时
{
if (detail.d.fAttached)
{
wprintf(L"%s %s,f=0x%x\r\n", detail.d.szName, detail.d.fAttached ? L"appeared" : L"was removed", flags);
}
Else
{
wprintf(L"%s %s,f=0x%x\r\n", detail.d.szName, detail.d.fAttached ? L"appeared" : L"was removed", flags);
}// if (detail.d.fAttached)
}//while
}//if(ret == WAIT_OBJECT_0)
/
上一篇:英创工控主板如何识别不同配置
下一篇:vs2008安装报错的解决方案