Russian Qt Forum
Март 28, 2024, 17:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с nativeEvent  (Прочитано 2344 раз)
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« : Август 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();


в
Код:
w.display();
запускается другая форма.

Как это побороть? может быть есть способ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #1 : Август 21, 2020, 13:10 »

QCoreApplication::installNativeEventFilter ?
Записан
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #2 : Октябрь 14, 2020, 05:15 »

QCoreApplication::installNativeEventFilter ?
Не разобрался как его использовать.
Вобщем, такое ощущение что сообщения приходят только первому отрисованному окну..

В обоих случаях отлавливается сообщение WM_DEVICECHANGE
Но в случае, когда есть форма авторизации на главное окно приходят только сообщения с параметром
DBT_DEVNODES_CHANGED
Следующего сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE уже не приходит.
« Последнее редактирование: Октябрь 14, 2020, 05:58 от 4sgen » Записан
4sgen
Новичок

Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #3 : Октябрь 14, 2020, 06:33 »

Для таких же дебилов как и я: надо было подписаться на сообщения

Код:
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;

    memset(&notificationFilter, 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(),
                                           &notificationFilter,
                                           DEVICE_NOTIFY_WINDOW_HANDLE);

Так. Еще не все. Обнаружил, что при каждом новом появлении или исчезновении устройства
сообщения с параметром DBT_DEVICEARRIVAL или DBT_DEVICEREMOVECOMPLETE приходят дважды.
« Последнее редактирование: Октябрь 14, 2020, 07:33 от 4sgen » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.