Нашел метод определения 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();
в
запускается другая форма.
Как это побороть? может быть есть способ?