Как связать, чтобы подключить / отключить событие USB-устройства в Windows 7/8/10 из Qt - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно сделать следующее. У меня есть конвертер USB-UART, и когда он подключен, он распознается как последовательный порт. Мне нужно прочитать имя этого последовательного порта и добавить его в выпадающий список, где пользователь может выбрать его и открыть для передачи данных.

Получение доступных последовательных портов не является проблемой в Qt. Но я хочу сделать это только тогда, когда устройство вставлено или удалено. Я сделал это в Linux, слушая соответствующие сигналы DBus. Есть ли что-то подобное в Windows? Что мне нужно, так это получать сообщения в моем приложении из системы каждый раз, когда подключается или отключается новый последовательный порт.

Я нашел несколько решений для .NET C #, но не знаю, как их воспроизвести вQt. Спасибо!

1 Ответ

0 голосов
/ 02 октября 2019

Благодаря @ кунифу Я нашел решение. Поэтому для прослушивания сообщений Windows вам нужно добавить свой EventFilter , унаследовав 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);

Вся благодарность @ кунифу !

...