2011-02-18 99 views
4

在我的qt應用程序中,我想將一些應用程序輸出數據保存到我的usb筆驅動器中的文件中。我需要把以下功能在我的Qt應用程序在Windows上檢測Qt中的USB通知

  1. 檢測USB驅動器插入
  2. 我只有一個USB插槽。
  3. 我插入後,我想知道它的驅動器號碼和字母,並將我的電腦中特定位置的文件傳輸到該USB驅動器。

有人可以告訴我哪些winapi .lib,.h和.dll文件我可以用來獲得所有上述功能嗎?

如果有人可以提供一些代碼片段,它將對我非常有用。

回答

3

Handle 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. 
     } 
    } 
    } 
} 
+0

當驅動器插入,也給驅動器盤符這將創建一個事件。檢測「驅動器號」(可能是USB序列號)要複雜得多,也許可以使用卷標或文件系統序列號。 – 2011-02-18 18:05:58

2

較早的答案現在已過時。以下爲我工作與QT5在Windows 10,在主窗口從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; 
}