USB 插入和移除事件被视为 DBT_DEVTYP_VOLUME 设备类型

问题描述 投票:0回答:1

我正在使用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 介质,我根本不希望收到该消息。

winapi mfc usb
1个回答
0
投票

我试图在应用程序窗口的构造函数中实例化此侦听器,因此对 getsafewnd 的调用为时过早,并返回了一些不相关的父窗口。将侦听器的创建移至窗口构造函数之后,并使用

AfxGetApp()->GetMainWnd()->m_hWnd
获取其句柄可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.