Обнаружение USB-уведомления в Qt на windows - PullRequest
4 голосов
/ 18 февраля 2011

В моем приложении qt я хочу сохранить некоторые выходные данные приложения в файл на моем USB-накопителе.Мне нужно добавить следующие функции в мое приложение qt

  1. Определить вставку USB-накопителя
  2. У меня только один слот USB.
  3. После того, как я вставлю его, я хочузнать его номер и букву диска и перенести файл в определенное место на моем ПК на этот USB-накопитель.

Кто-нибудь может сказать мне, какой файл winapi .lib, .h и .dll я должен использовать дляполучить все вышеперечисленные функции?

Если кто-то может предоставить некоторые фрагменты кода, это будет очень полезно для меня.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Обработка WM_DEVICECHANGE - См. http://lists.trolltech.com/qt-interest/2001-08/thread00698-0.html, как обрабатывать сообщения Windows в QT.

Если wParam равен DBT_DEVICEARRIVAL, тогда приведите lParam к DEV_BROADCAST_HDR *

Если структуры dbch_devicetype равны DBT_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.
      }
    }
  }
}
2 голосов
/ 22 декабря 2015

Предыдущий ответ устарел.Следующее работает для меня с QT5 на Windows 10, где 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;
}
...