在Windows上的Qt中检测USB通知

时间:2011-02-18 15:25:45

标签: winapi qt4 usb detect

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

  1. 检测USB驱动器插入
  2. 我只有一个USB插槽。
  3. 插入后我想知道它的驱动器号和字母,并将我PC中特定位置的文件传输到该USB驱动器。
  4. 有人可以告诉我哪些winapi .lib,.h和.dll文件我可以使用它来获得上述所有功能吗?

    如果有人可以提供一些代码段,那对我来说非常有帮助。

2 个答案:

答案 0 :(得分:3)

处理WM_DEVICECHANGE - 有关如何在QT中处理Windows消息,请参阅http://lists.trolltech.com/qt-interest/2001-08/thread00698-0.html

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

答案 1 :(得分: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;
}