Как узнать, когда новое устройство хранения USB подключено в Qt? - PullRequest
8 голосов
/ 12 мая 2009

Я хочу знать, когда USB-устройство подключено к компьютеру, на котором запущено мое приложение Qt (в Windows). В моем основном QWidget я переопределил winEventFilter, например:

bool winEventFilter ( MSG * msg, long * result ) {
    qDebug() << msg;
    return false;
}

Я ожидаю, что qDebug отправит хотя бы что-то, когда я подключу устройство USB, но я ничего не получаю.

Я предполагаю, что я в корне неправильно понимаю процесс здесь - это мое первое приложение Qt!

Ответы [ 2 ]

5 голосов
/ 12 мая 2009

Я полагаю, что вам может не хватать, чтобы позвонить, чтобы зарегистрироваться для уведомления устройства. Вот код, который я использую, чтобы сделать то же самое, хотя я переопределяю метод winEvent () класса QWidget, а не winEventFilter.

// Register for device connect notification
DEV_BROADCAST_DEVICEINTERFACE devInt;
ZeroMemory( &devInt, sizeof(devInt) );
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;

m_hDeviceNotify =
    RegisterDeviceNotification( winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE );   
if(m_hDeviceNotify == NULL)
{
    qDebug() << "Failed to register device notification";
} // end if

ПРИМЕЧАНИЕ. Скорее всего, вам потребуется изменить значения DEV_BROADCAST_DEVICEINTERFACE в соответствии с вашими потребностями.

РЕДАКТИРОВАТЬ: Чтобы использовать этот код, вам необходимо включить соответствующие заголовочные файлы и выполнить правильную настройку. DEV_BROADCAST_DEVICEINTERFACE требует, чтобы заголовок Dbt.h был включен. Кроме того, фокус этого кода находится на функции RegisterDeviceNotification. Информация доступна на MSDN

2 голосов
/ 15 мая 2009

Я работаю в том же духе, но в C #.

вам необходимо зарегистрировать ваше приложение в системе (посмотрите на функцию RegisterHidNotification ()). Моя выглядит так: `

void RegisterHidNotification() //Register this application to recieve all USB device notices

        {
            BroadcastHeader dbi = new BroadcastHeader();
            int size = Marshal.SizeOf(dbi);
            dbi.Size = size;
            dbi.Type = DeviceType.DeviceInterface;
            **dbi.Classguid = GUID_DEVINTERFACE_USB_DEVICE**;
            dbi.Name = 0;
            IntPtr buffer = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(dbi, buffer, true);
            IntPtr r = RegisterDeviceNotification(this.Handle, buffer, (int)DeviceEvents.regWindowHandle);
            if (r == IntPtr.Zero)
                statusLabel.Text = GetLastError().ToString();
        }`

Самая важная часть функции - это бит, который я выделил жирным шрифтом (или, по крайней мере, попытался). Определен как: public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); Надеюсь, вы сможете адаптировать его к своему приложению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...