【问题标题】:Detecting USB notification in Qt on windows在 Windows 上的 Qt 中检测 USB 通知
【发布时间】:2011-02-18 15:25:45
【问题描述】:

在我的 qt 应用程序中,我想将一些应用程序输出数据保存到我的 USB 笔式驱动器中的文件中。我需要在我的 qt 应用程序中添加以下功能

  1. 检测 USB 驱动器插入
  2. 我只有一个 USB 插槽。
  3. 插入后,我想知道它的驱动器号和盘符,并将我电脑中特定位置的文件传输到该 USB 驱动器。

谁能告诉我我必须使用哪个 winapi .lib、.h 和 .dll 文件来获得上述所有功能?

如果有人能提供一些sn-ps的代码,对我很有帮助。

【问题讨论】:

    标签: winapi qt4 usb detect


    【解决方案1】:

    处理WM_DEVICECHANGE - 请参阅http://lists.trolltech.com/qt-interest/2001-08/thread00698-0.html 了解如何在 QT 中处理 windows 消息。

    如果 wParam 是 DBT_DEVICEARRIVAL,则将 lParam 转换为 DEV_BROADCAST_HDR *

    如果结构 dbch_devicetypeDBT_DEVTYP_VOLUME 再次转换 lParam,这次是 DEV_BROADCAST_VOLUME *

    现在检查 dbcv_unitmask 位字段,遍历位 0..31 并检查相应的驱动器是否与您的 USB 驱动器匹配。

    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.
          }
        }
      }
    }
    

    【讨论】:

    • 这将在插入驱动器时创建一个事件并提供驱动器号。检测“驱动器号”(可能是 USB 序列号)要复杂得多,也许可以使用卷标或文件系统序列号。
    • 有没有类似GetSystemPowerStatus(&status);的函数这样我就可以轮询状态?您能否让我知道我必须包含的头文件和 .lib 文件名才能使用它?
    【解决方案2】:

    较早的答案现已过时。以下内容适用于 Windows 10 上的 QT5,其中 MainWindow 派生自 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      相关资源
      最近更新 更多