Qt中通过Windows消息进行监测串口的热插拔
1. QAbstractNativeEventFilter
对于此类的Qt官方解释为:
The QAbstractNativeEventFilter class provides an interface for receiving native events, such as MSG or XCB event structs. More…
这个抽象事件过滤类提供了一个接收本地事件的接口,类如Windows的MSG或者XCB…
所以,需要我们的类继承此类,并重写虚函数。形如:
class OwnerClass : public QMainWindow, public QAbstractNativeEventFilter{
......
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
......
}
2.具体实现
#include <Windows.h>
#include <dbt.h>
bool OwnerClass::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:
if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) {
PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb;
QString port = QString::fromWCharArray(lpdbv->dbcp_name);//插入的串口名
//emit open(port);//发送串口打开信号
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) {
PDEV_BROADCAST_PORT lpdbv = (PDEV_BROADCAST_PORT)lpdb;
QString port = QString::fromWCharArray(lpdbv->dbcp_name);//拔出的串口名
//emit close(port);//发送串口关闭信号
}
break;
case DBT_DEVNODES_CHANGED:
break;
default:
break;
}
}
return QWidget::nativeEvent(eventType, message, result);
}
3 注册
在main函数中注册过滤器,形如下图所示:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性