过滤Windows的事件消息,其中WM_DEVICECHANGE是设备发生变化时的Windows发给各个程序的事件消息,再通过wParam判断是设备插入(DBT_DEVICEARRIVAL)还是拔出(DBT_DEVICEREMOVECOMPLETE)。
在Qt中添加两个文件。
usb_listener.cpp
#include "usb_listener.h"
#include <QApplication>
#include <QDebug>
bool usb_listener::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
unsigned int msgType = msg->message;
if(msgType == WM_DEVICECHANGE) {
emit DeviceChangeCbk();
if(msg->wParam == DBT_DEVICEARRIVAL)
{
qDebug("usb in");
emit DevicePlugIn(); //触发信号
}
if(msg->wParam == DBT_DEVICEREMOVECOMPLETE)
{
qDebug("usb out");
emit DevicePlugOut(); //触发信号
}
}
return QWidget::nativeEvent(eventType, message, result);
}
//触发信号
void usb_listener::EmitMySignal()
{
emit DevicePlugIn();
}
usb_listener.h
#ifndef USB_LISTENER_H
#define USB_LISTENER_H
#include <QWidget>
#include <windows.h>
#include <QAbstractNativeEventFilter>
#include <dbt.h>
class usb_listener:public QWidget, public QAbstractNativeEventFilter
{
Q_OBJECT
public:
void EmitMySignal();
protected:
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
signals:
void DeviceChangeCbk();
void DevicePlugIn();
void DevicePlugOut();
};
#endif // USB_LISTENER_H
如何使用
在pro文件中:
添加QT += serialport
在mainwindow中:
完成信号的连接
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qlabel.h"
#include <QDebug>
#include "usb_listener.h"
#include <QtSerialPort/QSerialPortInfo>
usb_listener *m_usb_listener = Q_NULLPTR;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_usb_listener = new usb_listener;
qApp->installNativeEventFilter(m_usb_listener);
connect(m_usb_listener, &usb_listener::DevicePlugIn, [=](){
//do something...
qDebug("do something...");
});
m_usb_listener->EmitMySignal(); //手动触发一次
//ui->label->setText("hello world");
qDebug("hello");
}
MainWindow::~MainWindow()
{
delete ui;
}