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

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

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

我希望qDebug发送至less一些东西,当我连接一个USB设备,但我什么都没有得到。

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

我相信你可能会缺少的是呼叫注册设备通知。 这里是我用来做同样的事情的代码,尽管我重写了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上可用

我正在沿着相同的路线,但在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"); 希望你能适应你的应用程序。

这个链接到Trolltech邮件列表可能是有用的。