如何知道Qt中何时连接了新的USB存储设备?

c++ windows qt usb

13395 观看

3回复

52788 作者的声誉

我想知道什么时候USB设备连接到运行我的Qt应用程序的计算机(在Windows中)。在我的主要QWidget中,我重新实现了winEventFilter这样:

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

当我连接USB设备时,我希望qDebug能发送至少一些内容,但我什么也得不到。

我猜我从根本上误解了这个过程 - 这是我的第一个Qt应用程序!

作者: Skilldrick 的来源 发布者: 2009 年 5 月 12 日

回应 (3)


6

133 作者的声誉

决定

我相信你可能缺少的是注册设备通知的电话。这是我用来做同样事情的代码,虽然我覆盖了QWidget类的winEvent()方法而不是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上可用

作者: brader24 发布者: 12.05.2009 03:39

2

3262 作者的声誉

我在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"); 希望您能够根据您的应用进行调整。

作者: Dark Star1 发布者: 14.05.2009 08:47

0

657 作者的声誉

您可以轻松地重新实现QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)并检查设备连接:

    #ifdef Q_OS_WIN
    #include <Dbt.h>
    #endif

    bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) {
#ifdef Q_OS_WIN
        MSG* msg = reinterpret_cast<MSG*>(message);
        if (msg->message == WM_DEVICECHANGE) {
            switch (msg->wParam) {
            case DBT_DEVICEARRIVAL:
                qDebug() << "connected";
                break;
            case DBT_DEVICEREMOVECOMPLETE:
                qDebug() << "disconnected";
                break;
            default:
                break;
            }
        }
#endif // Q_OS_WIN
        return false;
    }
作者: IMAN4K 发布者: 17.08.2019 08:55
32x32