Название: Проблема с nativeEvent
Отправлено: 4sgen от Август 21, 2020, 12:28
Нашел метод определения VID PID вставляемого устройства. bool MainWindow::nativeEvent([[maybe_unused]] const QByteArray& eventType, void *message, [[maybe_unused]] long *result) {
MSG *msg = static_cast< MSG * >(message); int msgType = msg->message; if (msgType == WM_DEVICECHANGE) { if (msg->wParam == DBT_DEVICEARRIVAL || msg->wParam == DBT_DEVICEREMOVECOMPLETE) { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam; PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE) lpdb; if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { QString path = QString::fromWCharArray(lpdbv->dbcc_name); qDebug()<<path; m_DevConnect->VID = ""; m_DevConnect->PID = ""; m_DevConnect->SN = ""; if (!path.isEmpty()) { if (path.contains("VID_", Qt::CaseInsensitive)) m_DevConnect->VID = path.mid(path.indexOf("VID_")+4, 4); if (path.contains("PID_", Qt::CaseInsensitive)) m_DevConnect->PID = path.mid(path.indexOf("PID_")+4, 4); QRegExp rx("#\\w{8}#"); if (path.contains(rx)) m_DevConnect->SN = path.mid(rx.indexIn(path)+1, 8); m_isBoardConnected = path.contains(VID_CP2112, Qt::CaseInsensitive); m_isOPMConnected = path.contains(VID_OPM, Qt::CaseInsensitive); } else return false;
if (msg->wParam == DBT_DEVICEARRIVAL) emit SigUsbArrived(path); else emit SigUsbRemoved(path); return true; } } } return false; }
Все прекрасно работает. Но если до вызова главного окна MainWindow было какое-то другое окно, метод перестает вызываться. Сейчас обхожусь таким способом: w.show(); w.hide(); w.display();
в запускается другая форма. Как это побороть? может быть есть способ?
Название: Re: Проблема с nativeEvent
Отправлено: Авварон от Август 21, 2020, 13:10
QCoreApplication::installNativeEventFilter ?
Название: Re: Проблема с nativeEvent
Отправлено: 4sgen от Октябрь 14, 2020, 05:15
QCoreApplication::installNativeEventFilter ?
Не разобрался как его использовать. Вобщем, такое ощущение что сообщения приходят только первому отрисованному окну.. В обоих случаях отлавливается сообщение WM_DEVICECHANGE Но в случае, когда есть форма авторизации на главное окно приходят только сообщения с параметром DBT_DEVNODES_CHANGED Следующего сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE уже не приходит.
Название: Re: Проблема с nativeEvent
Отправлено: 4sgen от Октябрь 14, 2020, 06:33
Для таких же дебилов как и я: надо было подписаться на сообщения DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
memset(¬ificationFilter, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE)); notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[0];
devNotify = RegisterDeviceNotification((HANDLE)this->winId(), ¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); Так. Еще не все. Обнаружил, что при каждом новом появлении или исчезновении устройства сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE приходят дважды.
|