如何获知Windows下U盘弹出(不是拔出)消息

shmiloveyou 2016-08-24 09:37:10
最近遇到一个难题——在Windows下用Qt实现U盘弹出、插入、拔出的监听。其实质是获取Windows的相关消息。之前没有相关处理经验,于是一顿搜索,找到如下方案,但仅能监听到U的插入、拔出事件,对U盘的弹出(U盘盘符|右键|弹出)无法监听到:

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
//处理Windows系统消息
MSG* msg = (MSG*)message;

int msgType = msg->message;
if(msgType == WM_DEVICECHANGE) //Windows设备消息
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch(msg->wParam)
{
case DBT_DEVICEARRIVAL:
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) //逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags == 0)
{
qDebug() << "USB_设备物理插入";
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) //逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags == 0)
{
qDebug() << "USB_设备物理拔出";
}
}
break;
}
}
return false;
}

对于msg->wParam消息参数中的其它类型分别都测试过,没有一个是用于标记“U盘弹出”的消息事件,参数类型列举如下:

 
DBT_DEVICEREMOVEPENDING
DBT_CONFIGCHANGECANCELED
DBT_CUSTOMEVENT
DBT_DEVICEQUERYREMOVE
DBT_DEVICEQUERYREMOVEFAILED
DBT_DEVNODES_CHANGED
DBT_QUERYCHANGECONFIG
DBT_USERDEFINED

在此求助有过相关处理经验或资料的同仁提供解决思路或者方案,谢谢!
...全文
1762 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shmiloveyou 2017-10-23
  • 打赏
  • 举报
回复
引用 5 楼 u012999850 的回复:
楼主,这个问题你解决了么?我目前也在做这个事情,并没有找到相应的解决方案,求指教
您好,还没有解决呢!不知道金山/360是怎么做到监测用户“右键盘符|弹出”操作。如果您后续找到相关解决方法,请附在此帖处,谢谢!
whitedove_lzm 2017-10-20
  • 打赏
  • 举报
回复
楼主,这个问题你解决了么?我目前也在做这个事情,并没有找到相应的解决方案,求指教
shmiloveyou 2016-08-27
  • 打赏
  • 举报
回复
没有找到对应的“U盘弹出消息”,只能另辟蹊径,通过定时轮询的方式查看哪些U盘被弹出。在微软的在线msdn上查到一个函数: https://msdn.microsoft.com/en-us/library/ff539806(v=vs.85).aspx CM_Request_Device_Eject function The CM_Request_Device_Eject function prepares a local device instance for safe removal, if the device is removable. If the device can be physically ejected, it will be. Syntax C++ CMAPI CONFIGRET WINAPI CM_Request_Device_Eject( _In_ DEVINST dnDevInst, _Out_opt_ PPNP_VETO_TYPE pVetoType, _Out_opt_ LPTSTR pszVetoName, _In_ ULONG ulNameLength, _In_ ULONG ulFlags ); 借用这个函数,暂时就用“轮询”方式货值U盘弹出,后面如果有幸能找到会再次一并附上……
shmiloveyou 2016-08-27
  • 打赏
  • 举报
回复
对Windows编程不太熟悉,针对这个问题搜索的目标比较宽泛,找了几天也没一点头绪......
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
还可以试试用Spy++监视Windows消息。
赵4老师 2016-08-25
  • 打赏
  • 举报
回复
Process Monitor 实时监视文件系统、注册表、进程、线程和 DLL 活动。 http://www.microsoft.com/china/technet/sysinternals/utilities/processmonitor.mspx WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧