USB设备插拔消息响应,获取VIDPID

STM32 USB HID 组合设备(配置多个接口) USB Compound Device,USB复合设备 USB Composite Device,USB组合设备   USB Composite Device,不内嵌Hub,几个设备的PID和VID都是相同。   此文均在STM32F767IGTx已实现普通custom HID工程上做解释。 //usb配置描述符 /* USB CUSTOM_HID device Configurati... 阅读详情

//USB Connect
#include "Dbt.h"
#include "usbiodef.h"
#include <winioctl.h>
#include <setupapi.h>
#include <initguid.h>  

DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,   
            0xA5DCBF10L,   0x6530,   0x11D2,   0x90,   0x1F,   0x00,   0xC0,   0x4F,   0xB9,   0x51,   0xED);   
DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB,    0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, \
            0xa0, 0xc9, 0x06, 0xbe, 0xd8);

#define GUID_CLASS_USBHUB               GUID_DEVINTERFACE_USB_HUB
#define GUID_CLASS_USB_DEVICE           GUID_DEVINTERFACE_USB_DEVICE

#pragma comment(lib, "hid.lib")
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "imagehlp.lib")


BOOL CCameraMsgDlg::OnDeviceConnect()
{

    HINSTANCE hInstance = (HINSTANCE)GetWindowWord(this->m_hWnd, GWL_HINSTANCE);

    WNDCLASS wndclass;

    wndclass.style          = 0;
    wndclass.lpfnWndProc    = ConnWndProc;
    wndclass.cbClsExtra     = 0;
    wndclass.cbWndExtra     = 0;
    wndclass.hInstance      = hInstance;
    wndclass.hIcon          = NULL;
    wndclass.hCursor        = NULL;
    wndclass.hbrBackground  = NULL;
    wndclass.lpszMenuName   = NULL;
    wndclass.lpszClassName  = "InspurDeviceWnd";

    RegisterClass (&wndclass);

    g_hwndConnDev = CreateWindow(wndclass.lpszClassName, // pointer to registered class name
        "HeHe Device Window",       // pointer to window name
        0,// window style
        0,                                // horizontal position of window
        0,                                // vertical position of window
        0,                                // window width
        0,                                // window height
        NULL,                            // handle to parent or owner window
        NULL,                            // handle to menu or child-window identifier
        hInstance,                    // handle to application instance
        NULL);                            // pointer to window-creation data

    ::ShowWindow (g_hwndConnDev, SW_HIDE);

    DEV_BROADCAST_DEVICEINTERFACE   broadcastInterface;    
    //SECURITY_ATTRIBUTES                sec_attr;
    //SECURITY_DESCRIPTOR                sd;

    ZeroMemory( &broadcastInterface,sizeof(broadcastInterface));
    broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;


    memcpy( &(broadcastInterface.dbcc_classguid),
        &(GUID_CLASS_USB_DEVICE),
        sizeof(struct _GUID));

   HANDLE Hhanm_hNotifyDevHandle = RegisterDeviceNotification((HANDLE)g_hwndConnDev,
        &broadcastInterface,
        DEVICE_NOTIFY_WINDOW_HANDLE );

    // Now register for Hub notifications.
    memcpy( &(broadcastInterface.dbcc_classguid),
        &(GUID_CLASS_USBHUB),
        sizeof(struct _GUID));

    HANDLE    m_hNotifyHubHandle = RegisterDeviceNotification((HANDLE)g_hwndConnDev,
        &broadcastInterface,
        DEVICE_NOTIFY_WINDOW_HANDLE);

    return TRUE;

}

LRESULT CALLBACK ConnWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    PDEV_BROADCAST_HDR                pDevBcastHdr;
    PDEV_BROADCAST_DEVICEINTERFACE    pDevBcastDevIface;
    char *                            lpTmp=0;

    switch (msg)
    {
    case WM_CREATE:
        break;
    case WM_DEVICECHANGE:
        switch (wParam)
        {

        case DBT_DEVICEARRIVAL:
        case DBT_DEVICEREMOVECOMPLETE:

            pDevBcastHdr = (PDEV_BROADCAST_HDR)lParam;
            if (! pDevBcastHdr || pDevBcastHdr->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
                break;
            pDevBcastDevIface = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;

            // Get Vid Pid value
            lpTmp = strchr (pDevBcastDevIface->dbcc_name, 'V');
             if(lpTmp)
             {
                 lpTmp += 4;
                if(!memcmp(lpTmp,g_cVID,4))
                {
                    if (lpTmp = strchr(lpTmp, 'P'))
                    {
                        lpTmp += 4;
                        if(!memcmp(lpTmp,g_cPID_RGB,4) || !memcmp(lpTmp,g_cPID_Infrared,4))
                        {
                            //2USB connect status
                            if(wParam == DBT_DEVICEREMOVECOMPLETE)
                            {
                                if(g_pCameraMsgDlg)
                                {
                                    g_pCameraMsgDlg->WriteStatusMemory(1);
                                }
                            }
                            else if(wParam == DBT_DEVICEARRIVAL)
                            {
                                //2USB all Connect 
                                if(GetCameraUSB())
                                {
                                    if(g_pCameraMsgDlg)
                                    {
                                        g_pCameraMsgDlg->WriteStatusMemory(0);
                                    }
                                }
                            }
                        }
                    }
                }
             }
            //sscanf ((const char *)lpTmp, "%x", &wVendorId);
    
            break;
        }
        break;
    case WM_CLOSE:
        {
            DestroyWindow(g_hwndConnDev);
            break;
        }
    case WM_DESTROY:
        {
            // Wait all Device DLL are closed !!!
            PostQuitMessage(0);
        }
        break;
    default:
        return DefWindowProc (hwnd, msg, wParam, lParam);
    }

    return 0;
}

通过USB VID和PID卸载USB设备 以前也发过一几篇关于卸载USB设备的文章,其实原理都是一样都是使用同一个API "CM_Request_Device_Eject_ExW"来完成卸载工作,上一篇是通过遍历USB接点实现,这篇文章直接通过USB 的VID和PID获取其对应的DevInst来完成卸载工作。本篇文章通过使用了WMI技术来实现了很多关键点的功能。 查了很多资料想了很多方法也没找到从一个USB盘符获取该USB设备的V 阅读详情

相关推荐

获取USB设备插拔消息的备忘

获取USB设备插拔消息的备忘coolslob(coolslob@163.com)先记录要点,有空再整理成文。1、可根据dbch_devicetype(DBT_DEVTYP_DEVICEINTERFACE和DBT_DEVTYP_VOLUME),分别得到PID/VID/SN和盘符号。2、当USB设备不是存储设备时,只出发一次WM_DEVICECHANGE,devicetype是DBT_DEVTYP_D

coolslob 8143

USB的VID和PID

USB Vendor IDs 厂商 VID 厂商 VID 厂商 VID 厂商 VID 厂商 VID MTK 0e8d Qualcomm 05c6 Google 18d1 Huawei 12d1 HTC 0bb4 Acer 0502 ASUS 0b05 Dell 413c Foxconn 0489 Fujitsu 04c5 Garmin-Asus 091e Haier 201...

连长的博客 5545

MFC监控USB接口插拔情况并获取VID与PID

MFC监控USB接口插拔情况,并获取VID与PID显示出来。 开发工具:VS2015

前端获取usb串口,实现电子秤的对接

纯vue 获取usb串口,实现电子秤的对接

weixin_46166771的博客 6712

C#获取usb设备VID和PID

//调用方法:搜索所有USB设备.. USB.WhoUsbDevice(0, 0, Guid.Empty)

从零到一:AIGC+Unity3D打造动态天空盒的实战指南

本文详细介绍了如何利用AIGC技术结合Unity3D打造动态天空盒的实战指南。通过AIGC生成360全景图,再集成到Unity3D中,实现高效、多样化的天空盒效果。文章涵盖了从AIGC全景图生成、工作流搭建到Unity场景集成的完整流程,并提供了代码示例和优化建议,帮助开发者快速掌握这一技术。

weixin_29021291的博客 603

C# 串口获取更详细信息 设备描述、PID、VID

C# 调用了windows steupAPI 里的接口获取了串口列表信息。

m0_54012127的博客 3512

聊一聊固态电池和钠离子电池新技术

总之,固态电池是一种“安全又高效的未来电池”,它的好处非常明显,但目前还处于研发阶段,离普及还有一段距离。未来,这两种技术可能会与锂离子电池并存,分别满足不同的市场需求。我尝试用最通俗易懂的语言将复杂的技术讲给大家听。钠离子电池和锂离子电池的工作原理很相似,但它用的是。固态电池和钠离子电池是两种正在研发和推广的。,它们有潜力解决现有锂离子电池的部分缺点。,而不是锂(Li)。

weixin_33324696的博客 3333

USB-VID和PID

根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。 ...

BUG从入门到精通 1530

一文读懂无人机AI识别算法,原理、技术、应用

本文详细介绍了无人机识别算法的工作原理、技术优势以及在多个行业的应用前景,展现了其在提升安全监控、资源管理和应急响应中的关键作用。尽管无人机识别算法在多个领域展现出巨大潜力,但仍面临技术挑战,如算法的准确性、数据的实时处理能力以及对复杂环境的适应性。4. 消防与城市管理: 无人机识别算法在消防和城市管理中的应用,为相关部门提供了及时的信息支持,提升了应急处置能力和城市管理水平。1. 公安监控: 无人机识别算法在公安领域的应用,可以实时识别犯罪嫌疑人和违法行为,有效提升城市治安管理的智能化水平。

foiadrone的博客 1849

深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略

本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。

郑伟强dev的专栏 173

vc通过usb获取手机设备vidpid

#include #include #pragma comment(lib,"setupapi.lib") DEFINE_GUID (UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed); void getmobilepho

Keivin 5450

LVGL在单色屏上运行

本文主要讲述LVGL在单色屏应用中的实现思路,并已验证通过。网上关于lvgl移植的文章有很多了,本文不加以赘述。

weixin_43278295的博客 4463

Qt 动态链接库监听USB热插拔,获取硬件VID,PID

Qt中对USB设备的插拔,可使用nativeEvent系统消息处理函数进行处理,但该函数仅支持当前窗口下的USB设备的监控,当需要在生成的动态链接库中监控系统消息事件,需要使用nativeEventFilter。在需要使用时,工程中使用qApp->installNativeEventFilter()的方式安装事件过滤器。 对于USB的设备获取VID,PID,还需要对硬件GUID进行注册,由于是库中注册,需要传入界面对应的WinId

zjgo007的专栏 2858

网络工程师软考通关指南:网络新技术与应用深度解析

网络安全与管理是网络工程师必须掌握的核心技能,华为设备在企业网络中广泛应用。建议考生在理解安全原理的基础上,重点掌握华为特有的命令体系和配置方法,通过模拟实验加深理解。下篇文章将深入讲解"网络优化与QoS"章节,涵盖流量调度、拥塞避免、服务质量等关键技术,敬请期待。

Programming Talk 253

【Unity 实用工具篇】✨| 受击插件Feel 详细教程,开发游戏时更好的操控 游戏打击感

在一个游戏中,游戏手感对于游戏的整体游玩体验是非常重要的,而游戏手感中有一个很重要的点:打击感 那本篇文章就来讲一下打击感中的受击反馈部分。 在游戏中经常会用到攻击敌人,敌人扣血,执行某些受击功能的执行,尤其是对于有战斗场景的游戏来说,这就是标准的受击反馈。 所以引出本篇文章的主角:受击插件 Feel 的使用,2D和3D游戏都可以使用。

努力前行,总会成为自己心中的那道光 3万+

【VC】 获取电脑USB设备VID和PID等信息。

1,添加头文件和宏定义 #include #include #pragma comment(lib,"setupapi.lib") DEFINE_GUID (UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed); //USB GUID

shen_wei的专栏 8414

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(一)

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(一)

宁波阿成的博客 660

MFC HID设备热插拔检测指定VID和PID

在做上位机时,需要检测指定VID和PID的HID设备接入或者移除,随手记录之。1、在xxxxDlg.cpp文件增加消息 ON_WM_DEVICECHANGE。2、在xxxxDlg.h头文件增加消息处理函数。3、include头文件。4、在初始化函数注册。

u012583900的博客 399

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Windows枚举设备信息

枚举设备信息主要通过SetupAPI 模块中的接口来实现,配合对应的设备类 GUID。 这里以枚举 USB 设备信息为例,包含设备实例地址等: SetupDiEnumDeviceInfo

龚建波 2541

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

(已解决!GUID的外部定义和内部定义)VC编译错误:error LNK2001: unresolved external symbol _GUID_DEVINTERFACE_USB_DEVICE

兜了一大圈后,回到原点,再次思索如何解决。先看上次的结果:“自己定义之后,提示重复链接;不自己定义,包含initguid.h,又提示其他的GUID重复定义;不自己定义,也不包含,提示没有链接到lib。” 此次,再次编译时,我想到一个折衷的办法,既能保证“其他的GUID”不重复定义,又能保证GUID_DEVINTERFACE_USB_DEVICE被定义。如下:#include

尘埃落定 7171

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android监听usb插拔pid,MFC监控USB接口插拔情况并获取VID与PID

【实例简介】MFC监控USB接口插拔情况,并获取VID与PID显示出来。开发工具:VS2015【实例截图】【核心代码】049e4e43-1768-44e3-a5ad-92534da32a6e├── Debug│ ├── USB_test.exe│ ├── USB_test.ilk│ └── USB_test.pdb├── ipch│ └── USB_TEST-7ac60d3d│...

weixin_26735445的博客 365

MFC-设备插入后获取插入设备的信息

在这种情况下,尽管是网络设备,操作系统并不会通过 GUID_DEVINTERFACE_NET 触发事件,而是触发 USB 设备事件。有一些通过usb插入的设备,如车载摄像头,只能识别成usb设备,如果注册成网络设备,程序识别不出来新插入的设备信息,在。可以识别新设备的插入拔出,但是需要在初始化是注册设备通知,如果不知道要插入的设备类型,就需要注册所有设备,不然在。函数中系统传入的参数会固定,nEventType=7,dwData=NULL。1.定义设备类型的GUID(sdk有的版本没有缺少一些GUID)

weixin_45888658的博客 667

C++获取所有USB接口的vid、pid等信息

最近项目要写一个MFC的外挂程序,要分别获取电脑上所有扫描枪的输入信息,这时我们就需要根据扫描枪的vid和pid进行区分,有一些同批次同型号的输入设备vid和pid会相同,我们可能需要设备实例路径进行区分,可以在设备管理器->键盘->点击设备查看,如图: 这里记录一下获取USB信息的代码,因为涉及到公司业务,只给出这部分我封装好的类,这是MFC下继承CDialogEx的类,C++只需...

qq_39554698的博客 1万+

USB设备VID-PID读取

#include <setupapi.h> #pragma comment(lib, "setupapi.lib") CHAR g_cVID[5] = {0}; CHAR g_cPID_RGB[5] = {0}; CHAR g_cPID_Infrared[5] = {0}; BOOL GetCameraUSB() { BOOL bRet = FALSE; BOOL...

ADA_Ivan的博客 3544
上一篇: USB设备VID-PID读取
下一篇: C++图片数据流显示在窗口上
ADA_Ivan
博客等级 码龄10年 2粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值