我正在使用MFC和win32开发和维护一个应用程序,该应用程序需要了解USB WM_DEVICECHANGE消息何时发送到消息队列。我在各种帖子中被告知,为了接收 USB 驱动器事件,我必须注册一个需要 DBT_DEVTYP_DEVICEINTERFACE 事件的侦听器。这是我的做法:
HWND hWnd = GetSafeHwnd();
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
m_hUsbEventListener = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
if (!m_hUsbEventListener) {
LOG4CPLUS_ERROR(THE_LOGGER, "Failed to register USB event listener. Reports may be unreliable.");
}
但是,当我去处理 WM_DEVICECHANGE 时,我只收到来自类型为 DBT_DEVTYP_VOLUME 的设备的消息,我根本没想到会收到该消息。以下是我管理消息的方法,基本上直接从 MSDN 文档中提取:
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lparam;
if (pHdr != nullptr) {
if (pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME) {
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)pHdr;
char driveLetter = FirstDriveFromMask(lpdbv->dbcv_unitmask);
switch (wPARAM)
{
case DBT_DEVICEARRIVAL:
break;
case DBT_DEVICEREMOVECOMPLETE:
break;
}
}
else if (pHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
switch (wPARAM)
{
case DBT_DEVICEARRIVAL:
break;
case DBT_DEVICEREMOVECOMPLETE:
break;
}
}
}
return 0L;
我找不到有关哪个物理媒体硬件具有哪种设备类型的任何信息。任何信息将不胜感激。
我尝试注册一个设备特定的事件侦听器,或多或少遵循此帖子接受的回复:C++ Win32 Not receive DBT_DEVICEARRIVAL or DBT_DEVICEREMOVECOMPLETE on WM_DEVICECHANGE
我原本希望收到一条包含 DBT_DEVTYP_DEVICEINTERFACE 的 dbch_devicetype 的消息,但我却收到了 DBT_DEVTYP_VOLUME 类型的消息,而对于 USB 介质,我根本不希望收到该消息。
我试图在应用程序窗口的构造函数中实例化此侦听器,因此对 getsafewnd 的调用为时过早,并返回了一些不相关的父窗口。将侦听器的创建移至窗口构造函数之后,并使用
AfxGetApp()->GetMainWnd()->m_hWnd
获取其句柄可以解决此问题。