如何从 Qt 绑定到 windows 7/8/10 中的 connect/disconnect USB 设备事件
How to bind to connect/disconnect USB device event in windows 7/8/10 from Qt
我需要做以下事情。我有 USB-UART 转换器,当它插入时它被识别为串口。我需要读取这个串口的名称并将其添加到组合框中,用户可以在其中选择它并打开以进行数据传输。
获取可用的串行端口在 Qt 中不是问题。但我只想在插入或移除设备时才这样做。我在 Linux 中通过监听相应的 DBus 信号来做到这一点。 Windows中有类似的东西吗?我真正需要的是每次连接或断开新串口时从系统接收我的应用程序中的消息。
我找到了一些适用于 .NET C# 的解决方案,但不知道如何在 Qt 中重现它们。
谢谢!
感谢@kunif 我找到了解决方案。因此,要收听 Windows 消息,您需要通过继承 QAbstractNativeEventFilter 添加自己的 EventFilter,如下所示:
#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);
感谢@kunif !
我需要做以下事情。我有 USB-UART 转换器,当它插入时它被识别为串口。我需要读取这个串口的名称并将其添加到组合框中,用户可以在其中选择它并打开以进行数据传输。
获取可用的串行端口在 Qt 中不是问题。但我只想在插入或移除设备时才这样做。我在 Linux 中通过监听相应的 DBus 信号来做到这一点。 Windows中有类似的东西吗?我真正需要的是每次连接或断开新串口时从系统接收我的应用程序中的消息。
我找到了一些适用于 .NET C# 的解决方案,但不知道如何在 Qt 中重现它们。 谢谢!
感谢@kunif 我找到了解决方案。因此,要收听 Windows 消息,您需要通过继承 QAbstractNativeEventFilter 添加自己的 EventFilter,如下所示:
#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);
感谢@kunif !