Detecting USB notification in Qt on windows

后端 未结 2 1680
天涯浪人
天涯浪人 2021-01-19 17:53

In my qt application I want to save some application output data to an file in my usb pen drive. I need to put following features in my qt application

  1. Detect t
相关标签:
2条回答
  • 2021-01-19 18:08

    Handle WM_DEVICECHANGE - See http://lists.trolltech.com/qt-interest/2001-08/thread00698-0.html for how to handle windows messages in QT.

    If wParam is DBT_DEVICEARRIVAL then cast lParam to a DEV_BROADCAST_HDR *

    If the structures dbch_devicetype is DBT_DEVTYP_VOLUME cast lParam again, this time to a DEV_BROADCAST_VOLUME *

    Now check the dbcv_unitmask bit field, iterate over bits 0..31 and check if the corresponding drive match your USB drive.

    if (wParam == DBT_DEVICEARRIVAL) {
      if (((DEV_BROADCAST_HDR *) lParam)->dbch_devicetype == DBT_DEVTYP_VOLUME) {
        DWORD Mask = ((DEV_BROADCAST_VOLUME *) lParam)->dbcv_unitmask;
        for (int i = 0; i < 32; ++i) {
          if (Mask & (1 << i)) {
            char RootPath[4] = "A:\\";
            RootPath[0] += i;
            // Check if the root path in RootPath is your USB drive.
          }
        }
      }
    }
    
    0 讨论(0)
  • 2021-01-19 18:15

    The earlier answer is now out-of-date. The following worked for me with QT5 on Windows 10, where MainWindow is derived from QMainWindow:

    #include <QByteArray>
    #include <windows.h>
    #include <dbt.h>
    
    bool MainWindow::nativeEvent(const QByteArray& eventType, void* pMessage, long* pResult)
    {
        auto pWindowsMessage = static_cast<MSG*>(pMessage);
        auto wParam = pWindowsMessage->wParam;
        if (wParam == DBT_DEVICEARRIVAL || wParam == DBT_DEVICEREMOVECOMPLETE) {
            auto lParam = pWindowsMessage->lParam;
            auto deviceType = reinterpret_cast<DEV_BROADCAST_HDR*>(lParam)->dbch_devicetype;
            if (deviceType == DBT_DEVTYP_VOLUME) {
                auto unitmask = reinterpret_cast<DEV_BROADCAST_VOLUME*>(lParam)->dbcv_unitmask;
                for (int i = 0; i < 32; ++i) {
                    if ((unitmask & (1 << i)) != 0) {
                        setDriveChanged('A' + i, wParam == DBT_DEVICEARRIVAL);
                    }
                }
            }
        }
        return false;
    }
    
    0 讨论(0)
提交回复
热议问题