在Windows上使用Qt检测USB通知

4
在我的qt应用程序中,我想将一些应用程序输出数据保存到我的USB闪存驱动器中的文件中。我需要在我的qt应用程序中添加以下功能:
  1. 检测USB驱动器的插入
  2. 我只有一个USB插槽。
  3. 在我插入它之后,我想知道它的驱动器号和字母,并将一个文件传输到我的PC上特定位置的USB驱动器中。
有人能告诉我我需要使用哪个winapi .lib、.h和.dll文件才能获得以上所有功能吗?
如果有人能提供一些代码片段,那对我来说将非常有帮助。
2个回答

3

处理 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序列号)更加复杂,或许可以使用卷标或文件系统序列号代替。 - Ben Voigt
有没有类似于 GetSystemPowerStatus(&status); 的函数,以便我可以轮询状态?请问我需要包含哪个头文件和 .lib 文件才能使用它? - Surjya Narayana Padhi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接