我想知道USB设备何时连接到运行我的Qt应用程序的计算机(在Windows中)。在我的主要QWidget中,我重新实现了winEventFilter
,就像这样:
bool winEventFilter ( MSG * msg, long * result ) {
qDebug() << msg;
return false;
}
我希望qDebug在连接USB设备时至少发送一些东西,但我什么都没得到。
我猜我从根本上误解了这个过程 - 这是我的第一个Qt应用程序!
答案 0 :(得分:5)
我相信您可能缺少的是注册设备通知的电话。这是我用来做同样事情的代码,虽然我覆盖了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
答案 1 :(得分:2)
我的工作方式与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");
希望您能够根据您的应用进行调整。
答案 2 :(得分:1)