Winapi 在windows上的Qt中检测USB通知

Winapi 在windows上的Qt中检测USB通知,winapi,qt4,usb,detect,Winapi,Qt4,Usb,Detect,在我的qt应用程序中,我想将一些应用程序输出数据保存到usb笔驱动器中的文件中。我需要在我的qt应用程序中添加以下功能 检测usb驱动器插入 我只有一个usb插槽 插入后,我想知道它的驱动器号和字母,并将电脑中特定位置的文件传输到usb驱动器 有谁能告诉我,我必须使用哪个winapi.lib、.h和.dll文件来获得上述所有功能 如果有人能提供一些代码片段,这将对我非常有帮助。HandleWM_DEVICECHANGE-有关如何在QT中处理windows消息的信息,请参阅 如果wParam是DB

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

  • 检测usb驱动器插入
  • 我只有一个usb插槽
  • 插入后,我想知道它的驱动器号和字母,并将电脑中特定位置的文件传输到usb驱动器
  • 有谁能告诉我,我必须使用哪个winapi.lib、.h和.dll文件来获得上述所有功能


    如果有人能提供一些代码片段,这将对我非常有帮助。

    Handle
    WM_DEVICECHANGE
    -有关如何在QT中处理windows消息的信息,请参阅

    如果wParam是
    DBT\u DEVICEARRIVAL
    ,则将LPRAM强制转换为
    DEV\u BROADCAST\u HDR*

    如果结构
    dbch\u设备类型
    DBT\u DEVTYP\u卷
    再次将LPRAM强制转换为
    DEV\u BROADCAST\u卷*

    现在检查
    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.
          }
        }
      }
    }
    
    if(wParam==DBT\u DEVICEARRIVAL){
    如果((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype==DBT_DEVTYP_VOLUME){
    DWORD掩码=((开发广播卷*)lParam)->dbcv单元掩码;
    对于(int i=0;i<32;++i){
    
    如果(Mask&(1先前的答案现在已过时。以下内容适用于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;
    }
    
    #包括
    #包括
    #包括
    bool主窗口::nativeEvent(常量QByteArray和事件类型,void*pMessage,long*pResult)
    {
    自动pWindowsMessage=静态_转换(pMessage);
    自动wParam=pWindowsMessage->wParam;
    如果(wParam==DBT|U设备到达时间| wParam==DBT|U设备移动完成){
    自动lParam=pWindowsMessage->lParam;
    自动设备类型=重新解释设备类型(lParam)->dbch设备类型;
    if(deviceType==DBT\u DEVTYP\u卷){
    自动单位掩码=重新解释强制转换(lParam)->dbcv\U单位掩码;
    对于(int i=0;i<32;++i){
    
    如果((unitmask&(1)在插入驱动器时会创建一个事件,并给出驱动器号。检测“驱动器号”(可能是USB序列号)要复杂得多,可能可以使用卷标或文件系统序列号。是否有GetSystemPowerStatus(&status)之类的函数;这样我就可以轮询状态了?您能告诉我要使用它必须包含的头文件和.lib文件名吗?