2011-02-18 8 views
4

Qt 애플리케이션에서 일부 USB 출력에 파일을 저장하려고합니다. 나는 USB 드라이브 삽입 Windows에서 Qt의 USB 알림 감지

  • 나는 단지 하나 개의 USB 슬롯이 감지 내 Qt는 응용 프로그램

    1. 에 다음과 같은 기능을 넣어해야합니다.
    2. 내가 삽입 한 후에 드라이브 번호와 문자를 알고 내 PC의 특정 위치에있는 파일을 해당 USB 드라이브에 전송하려고합니다.

    누구나 위의 모든 기능을 사용하기 위해 내가 사용하고있는 winapi .lib, .h 및 .dll 파일을 말할 수 있습니까?

    누군가가 일부 코드 스 니펫을 제공 할 수 있다면 매우 유용 할 것입니다.

  • 답변

    3

    핸들 WM_DEVICECHANGE - QT에서 Windows 메시지를 처리하는 방법은 http://lists.trolltech.com/qt-interest/2001-08/thread00698-0.html을 참조하십시오.

    의 wParam는 DBT_DEVICEARRIVAL 다음 구조 dbch_devicetypeDBT_DEVTYP_VOLUME 캐스트 lParam에 다시 경우 dbcv_unitmask 비트 필드를 확인 지금 DEV_BROADCAST_VOLUME *

    하려면 DEV_BROADCAST_HDR *

    이 시간의 lParam 캐스팅 비트 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 일련 번호)를 탐지하는 것은 훨씬 복잡합니다. 아마도 볼륨 레이블이나 파일 시스템 일련 번호가 대신 사용될 수 있습니다. –

    +0

    GetSystemPowerStatus (& status)와 같은 함수가 있습니까? 내가 그 상태를 조사 할 수 있도록? 그리고 헤더 파일과 이것을 사용하기 위해 포함해야하는 .lib 파일 이름을 알려주시겠습니까? –

    +0

    링크가 작동하지 않습니다. 그것을 업데이트 할 수 있습니까? –

    2

    이전 답변은 구식입니다. 은 MainWindow를가 QMainWindow에서 파생 윈도우 10에 QT5와 나를 위해 일한 다음 : 드라이브가 삽입되고 또한 드라이브 문자를 제공 할 때 이벤트를 만듭니다

    #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; 
    } 
    
    관련 문제