我的 Qt 应用程序中收到了 WM_DEVICECHANGE,但未收到 DBT_DEVICEARRIVAL

2024-03-26

我正在按照一个示例来检测 Windows 7 中的 USB 闪存驱动器插件和拔出检测。我确实收到了通知WM_DEVICECHANGE但不是DBT_DEVICEARRIVAL这是插入USB设备时的情况。我的代码如下:

/*******************************************
*             WINDOWS EVENTS
********************************************/
/*We use the first WM_PAINT event to get the handle of main window
  and pass it to RegisterDeviceNotification function.
  It not possible to do this in the contructor because the
  main window does not exist yet.
  WM_DEVICECHANGE event notify us that a device is attached or detached */
bool USBexample::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
    MSG * msg = static_cast< MSG * > (message);
    int msgType = msg->message;
    if(msgType == WM_PAINT)
    {
        if(!msgp)   //Only the first WM_PAINT
        {
            GUID InterfaceClassGuid = HID_CLASSGUID;
            DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
            ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
            NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
            NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
            NotificationFilter.dbcc_classguid = InterfaceClassGuid;
            HWND hw = (HWND) this->effectiveWinId();   //Main window handle
            hDevNotify = RegisterDeviceNotification(hw,&NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
            msgp = true;
        }
    }
    if(msgType == WM_DEVICECHANGE)
    {
       qDebug() << "WM_DEVICECHANGE recieved";
       PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
       switch(msg->wParam)
       {
             case DBT_DEVICEARRIVAL: // never comes here!
                if (lpdb -> dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
                {

                    qDebug() << "DBT_DEVICEARRIVAL case";

                    PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
                    int i = 0;
                    QString s;
                    //to find a better way for this...
                    while(lpdbv->dbcc_name[i] != 0)
                    {
                        s.append(lpdbv->dbcc_name[i]);
                        i++;
                    }
                    s = s.toUpper();
                    if(s.contains(MY_DEVICE_VIDPID))
                        emit USB_Arrived();
                }
            break;
            case DBT_DEVICEREMOVECOMPLETE:
                if (lpdb -> dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
                {
                    qDebug() << "DBT_DEVICEREMOVECOMPLETE case";

                    PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
                    int i = 0;
                    QString s;
                    //to find a better way for this...
                    while(lpdbv->dbcc_name[i] != 0)
                    {
                        s.append(lpdbv->dbcc_name[i]);
                        i++;
                    }
                    s = s.toUpper();
                    if(s.contains(MY_DEVICE_VIDPID))
                        emit USB_Removed();
                }
            break;
       case DBT_DEVICEREMOVEPENDING :
       {
           qDebug() << "DBT_DEVICEREMOVEPENDING case";
       }
       break;
       default:
       {
           qDebug() << "Went to Default case";
       }


       }
    }
    return false;
}

我弄清楚了这一点,如果其他人遇到类似问题,这里是解决方案。

问题是InterfaceClassGuid在下面的行中。

GUID InterfaceClassGuid = HID_CLASSGUID;

HID_CLASSGUID在我的代码中设置为以下内容:

#define HID_CLASSGUID {0x4d1e55b2, 0xf16f, 0x11cf,{ 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}}

这是错误的,我从示例中学到了这一点,但从未意识到我需要更改它。不同类型的通知需要注册不同的值,在这种情况下帮助系统没有多大帮助,但这里是有效 GUID 的列表values http://pcsupport.about.com/od/driverssupport/a/device-class-guid.htm.

我将其更改为以下内容,现在我收到了所需的通知。

#define HID_CLASSGUID  {0x745a17a0,0x74d3, 0x11d0, 0xb6fe, 0x00a0c90f57da}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 Qt 应用程序中收到了 WM_DEVICECHANGE,但未收到 DBT_DEVICEARRIVAL 的相关文章

随机推荐

  • tensorflow.pad 是如何工作的?

    有tensorflow pad 的例子 t is 1 2 3 4 5 6 paddings is 1 1 2 2 rank of t is 2 tf pad t paddings CONSTANT gt 0 0 0 0 0 0 0 0 0
  • NPM 不安装任何模块:网络套接字挂起

    Salam 意思是你好 我在 ubuntu 12 04 上安装了最新版本的 node js 我没有使用任何代理 并且我的网络设置配置正确 并且自上次 NPM 正常工作以来一直保持完好 但现在 NPM 挂起任何模块的安装 并出现以下错误 na
  • 内部类放在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将javascript变量传递给php而不刷新页面

    我有一个 5x5 网格的 div 框 其中 25 个 当我将一个项目放入其中时 我使用 jQuery UI 进行注册 它将收到它所放入的盒子的标题和项目的名称 该部分起作用 我想将标题和名称传递给 PHP 而不刷新页面 因为这样项目将重置
  • TF51005: 查询引用了不存在的字段。该错误是由“[Custom.ReflectedWorkItemId]”引起的

    我尝试将 Azure DevOps 板从一个组织迁移到另一个组织 我使用这个工具 https github com nkdAgility azure devops migration tools https github com nkdAg
  • 如何在 Bootstrap 中将单个下拉菜单附加到正文

    我看过下拉菜单的文档作为组件 http getbootstrap com components dropdowns and 分别使用javascript http getbootstrap com javascript dropdowns
  • PerformSelectorOnMainThread 实现的底层细节:

    想知道是否有人知道或有指向讨论 Cocoa 的 performSelectorOnMainThread 方法的低级实现细节的良好文档 我最好的猜测 我认为可能非常接近 是它使用 mach 端口或它们之上的抽象来提供线程内通信 将选择器信息作
  • Android L 忽略形状作为可绘制背景

    我正在 Nexus 5 上测试 Android L Preview 我的应用程序出现问题 我有一些带有背景设置的 TextView android background drawable rounded textview 而 圆形文本视图
  • Bash 函数内间接变量赋值

    我有一个脚本 其中需要对用户输入进行多次评估 我正在研究的解决方案是将评估位放入一个函数中 并在每次需要评估输入时简单地调用该函数 问题是当我尝试更新时 1变量 指函数的第一个变量参数 我收到错误消息 VARIABLE 命令未找到 这是代码
  • Flutter - 如何测试本地化小部件?

    我读过这个问题的答案question https stackoverflow com questions 52463714 how to test localized widgets in flutter 但这并没有帮助我理解在我的情况下该
  • React 路由器更改 url 而不重新加载页面

    当我使用react router 0 13 3时 一切正常 我正在更改url并且发生了没有重新加载的转换 现在 在 React router 2 0 中 如果我手动更改 url 我的应用程序将完全重新加载 而不是简单的重定向 我如何解决它
  • C# Nhibernate 保存列表

    今天 我有一个包含 40 000 个寄存器的列表 我需要将其保存在我的 MSSQL 数据库中 当我尝试保存它时 我检查了控制台显示 我意识到它正在逐项保存 并且消耗了大量时间 即使我尝试使用下面的命令插入整个列表也是如此 List
  • 允许 UIWebView 内的位置访问

    我有一个基于 webview 的应用程序 当我访问时http maps google com http maps google com 我的 webview 没有像 Safari 那样传递位置 我知道需要 CLLocationManager
  • 检测显卡性能-JS

    这是一个远景 有没有办法通过 JS 插件来检测显卡性能的强弱 我们为客户构建了一个视差站点 它在性能较低的机器上出现卡顿 我们可以调整性能以使其全面更好地工作 但这当然会降低使用较高性能机器的用户的体验 我们也可以检测浏览器版本 但相同的浏
  • 如何在 Swift 中消除警告?

    我有一段代码会生成大量警告 已弃用的 API 使用 clang 我可以这样做 pragma clang diagnostic push pragma clang diagnostic ignored Wdeprecated declarat
  • 这个 Groovy 构造有什么问题?

    这是一个简短的 Groovy 脚本 import org apache commons io FileUtils def dir new File mydir def files FileUtils listFiles dir new St
  • 无法在 Qt 中设置几何图形

    我收到错误setGeometry在 Qt5 中的一个非常简单的程序中 int main int argc char argv QApplication a argc argv QLabel m photo new QLabel m phot
  • 自定义抛出异常javascript的错误消息

    我正在尝试自定义 javascript 中异常抛出的错误消息 到目前为止我的尝试都失败了 我正在尝试这个 但它不起作用 function abc sender args alert ex2 throw error new alert 你需要
  • 切换到 mysqli 后 LOCAL INFILE 出现问题

    任何了解在 PHP 中使用 LOCAL INFILE 的问题的人都会理解我对此的沮丧 我之前通过在连接调用中使用 128 标志 使 LOCAL INFILE 在所有 PHP 脚本中正常工作 mysql connect DB SERVER D
  • 我的 Qt 应用程序中收到了 WM_DEVICECHANGE,但未收到 DBT_DEVICEARRIVAL

    我正在按照一个示例来检测 Windows 7 中的 USB 闪存驱动器插件和拔出检测 我确实收到了通知WM DEVICECHANGE但不是DBT DEVICEARRIVAL这是插入USB设备时的情况 我的代码如下 WINDOWS EVENT