gpt4 book ai didi

c++ - 如何在 Windows 7/8/10 中从 Qt 绑定(bind)连接/断开 USB 设备事件

转载 作者:行者123 更新时间:2023-12-02 10:38:26 27 4
gpt4 key购买 nike

我需要执行以下操作。我有 USB-UART 转换器,当它插入时,它被识别为串行端口。我需要读取此串行端口的名称并将其添加到组合框中,用户可以在其中选择并打开以进行数据传输。

在 Qt 中获得可用的串行端口不是问题。但我只想在插入或移除设备时这样做。我在 Linux 中通过监听相应的 DBus 信号来做到这一点。 Windows中有类似的东西吗?我确切需要的是每次连接或断开新的串行端口时从系统接收我的应用程序中的消息。

我找到了一些 .NET C# 的解决方案,但不知道如何在 Qt 中重现它们。
谢谢!

最佳答案

感谢@库尼夫 我找到了解决方案。因此,要收听 Windows 消息,您需要添加自己的 事件过滤器 通过继承 QAbstractNativeEventFilter 像这样:

#include <QAbstractNativeEventFilter>
#include <QObject>

class DeviceEventFilter : public QObject, public QAbstractNativeEventFilter
{
Q_OBJECT

public:
DeviceEventFilter();
bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override;

signals:
void serialDeviceChanged();
};

并过滤您需要的消息 WM_DEVICECHANGE :
#include <windows.h>
#include <dbt.h>

bool DeviceEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *) {
if (eventType == "windows_generic_MSG") {
MSG *msg = static_cast<MSG *>(message);

if (msg->message == WM_DEVICECHANGE) {
if (msg->wParam == DBT_DEVICEARRIVAL || msg->wParam == DBT_DEVICEREMOVECOMPLETE) {
// connect to this signal to reread available ports or devices etc
emit serialDeviceChanged();
}
}
}
return false;
}

在您的代码中的某处,您可以访问 DeviceEventFilter对象添加这一行:
qApp->installNativeEventFilter(&devEventFilterObj);

或在 main.cpp :
QApplication app(argc, argv);
app.installNativeEventFilter(&devEventFilterObj);

感谢@ 库尼夫 !

关于c++ - 如何在 Windows 7/8/10 中从 Qt 绑定(bind)连接/断开 USB 设备事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58185648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com