在nativeEvent里面解析系統(tǒng)消息,獲取USB等設(shè)備的插入和拔出事件。
使用步驟:
窗口初始化時使用
RegisterDeviceNotification注冊設(shè)備通知在
nativeEvent函數(shù)里面解析系統(tǒng)消息窗口關(guān)閉時,使用
UnregisterDeviceNotification關(guān)閉指定的設(shè)備通知句柄
關(guān)鍵代碼如下:
- 注冊設(shè)備通知
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
devNotify = RegisterDeviceNotification(reinterpret_cast<HANDLE>(this->winId()), ¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);// DEVICE_NOTIFY_WINDOW_HANDLE); DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
if (!devNotify) {
qWarning() << "RegisterDeviceNotification failed";
}
}
- 解析系統(tǒng)消息
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) {
MSG *msg = (MSG *) message;
if (msg->message == WM_DEVICECHANGE) {
auto hdr = reinterpret_cast<PDEV_BROADCAST_HDR>(msg->lParam);
switch (msg->wParam) {
case DBT_DEVICEARRIVAL:
if (hdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
auto info = (PDEV_BROADCAST_DEVICEINTERFACE) hdr;
auto devName = QString::fromWCharArray(info->dbcc_name);
qDebug() << "+: " << devName;
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if (hdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
auto info = (PDEV_BROADCAST_DEVICEINTERFACE) hdr;
auto devName = QString::fromWCharArray(info->dbcc_name);
qDebug() << "-: " << devName;
}
break;
}
}
return false;
}
插拔串口時,輸出如下:
+: "\\\\?\\USB#VID_1A86&PID_7523................................."
-: "\\\\?\\USB#VID_1A86&PID_7523................................."
- 關(guān)閉指定的設(shè)備通知句柄
MainWindow::~MainWindow() {
if (devNotify) {
UnregisterDeviceNotification(devNotify);
}
}
版權(quán)聲明:本文為「txfly」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:http://m.itdecent.cn/p/9ec8a56c3f0f