- 导入头文件
#include <windows.h>
#include <dbt.h>
#include <QAbstractNativeEventFilter>
- 继承
QAbstractNativeEventFilter
并重写函数
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
- 添加过滤器
qApp->installNativeEventFilter(this);
- 函数实现
注1:在存在多个串口时,插拔其它串口时触发函数
bool xxx::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message;
if (msgType == WM_DEVICECHANGE)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch (msg->wParam)
{
case DBT_DEVICEARRIVAL: //device arrival
if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT)
{
//! 注1
//! 插入
load_all_serialport(); //自定义函数
}
break;
case DBT_DEVICEREMOVECOMPLETE: //device remove complete
if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT)
{
//! 注1
//! PDEV_BROADCAST_PORT pDevInfo = PDEV_BROADCAST_PORT(lpdb);
//! QString portName = QString::fromWCharArray(pDevInfo->dbcp_name);
//! 判断当前串口状态、连接串口名和插拔串口名是否一致
//! 断开串口
remove_all_serialport(); //自定义函数
}
break;
case DBT_DEVNODES_CHANGED: //devnodes
break;
default:
break;
}
}
return QWidget::nativeEvent(eventType, message, result);
}