最近遇到一个难题——在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在此求助有过相关处理经验或资料的同仁提供解决思路或者方案,谢谢!
{
//处理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在此求助有过相关处理经验或资料的同仁提供解决思路或者方案,谢谢!
https://msdn.microsoft.com/en-us/library/ff539806(v=vs.85).aspxCM_Request_Device_Eject functionThe 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盘弹出,后面如果有幸能找到会再次一并附上……