最近项目要写一个MFC的外挂程序,要分别获取电脑上所有扫描枪的输入信息,这时我们就需要根据扫描枪的vid和pid进行区分,有一些同批次同型号的输入设备vid和pid会相同,我们可能需要设备实例路径进行区分,可以在设备管理器->键盘->点击设备查看,如图:

这里记录一下获取USB信息的代码,因为涉及到公司业务,只给出这部分我封装好的类,这是MFC下继承CDialogEx的类,C++只需要略作修改,核心代码为HID_FindAllDevices函数,我对记录pid,vid的vector进行了去重,设备有pid,vid相同的需要修改。

ScannerDlg.h

#pragma once
#include <vector>
#include <algorithm>
#include "afxwin.h"// CScannerDlg 对话框
struct _VID_PID_
{USHORT V_ID;USHORT P_ID;_VID_PID_(USHORT vid, USHORT pid){V_ID = vid;P_ID = pid;}bool operator==(const _VID_PID_ &other){if (V_ID == other.V_ID && P_ID == other.P_ID)return true;return false;}
};class CScannerDlg : public CDialogEx
{DECLARE_DYNAMIC(CScannerDlg)public:CScannerDlg(CWnd* pParent = NULL);   // 标准构造函数virtual ~CScannerDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_SCANNER_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()private:std::vector<_VID_PID_> vecVidPid;void HID_FindAllDevices(unsigned short *FIFO_Length);
public:CComboBox m_combo_scanner;afx_msg void OnCbnDropdownComboScanner();afx_msg void OnBnClickedOk();
};

ScannerDlg.cpp

// ScannerDlg.cpp : 实现文件
//#include "stdafx.h"
#include "ScannerDlg.h"
#include "afxdialogex.h"
#include <iostream>
#include <string>
#include <fstream>
#include <setupapi.h>
#include <devguid.h>
#include <winioctl.h>
#include <regstr.h>
#include <conio.h>#pragma comment(lib,"setupapi.lib")
extern "C" {#include <hidsdi.h>
};
// CScannerDlg 对话框IMPLEMENT_DYNAMIC(CScannerDlg, CDialogEx)CScannerDlg::CScannerDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_SCANNER_DIALOG, pParent)
{}CScannerDlg::~CScannerDlg()
{}void CScannerDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_COMBO_SCANNER, m_combo_scanner);
}BEGIN_MESSAGE_MAP(CScannerDlg, CDialogEx)ON_CBN_DROPDOWN(IDC_COMBO_SCANNER, &CScannerDlg::OnCbnDropdownComboScanner)ON_BN_CLICKED(IDOK, &CScannerDlg::OnBnClickedOk)
END_MESSAGE_MAP()// CScannerDlg 消息处理程序
//查找所有vidpid
void CScannerDlg::HID_FindAllDevices(unsigned short *FIFO_Length)
{GUID                             HidGuid;HDEVINFO                         DevInfo;HIDD_ATTRIBUTES                   DevAttributes;SP_DEVICE_INTERFACE_DATA         DevData;PSP_DEVICE_INTERFACE_DETAIL_DATA DevDetail;PHIDP_PREPARSED_DATA          PreparsedData;HIDP_CAPS                   Capabilities;ULONG                            Length;int                              Index;BOOL                             ok;HANDLE DevHandle;int DevCount = 0;vecVidPid.clear();/* Get GUID for all System HIDs */HidD_GetHidGuid(&HidGuid);/* Get Device Information for all present devices */DevInfo = SetupDiGetClassDevs(&HidGuid,NULL,NULL,(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));DevData.cbSize = sizeof(DevData);DevDetail = NULL;Index = -1;*FIFO_Length = 0;/* Scan all Devices */do {Index++;/* Device Interface Element of a Device Information set */ok = SetupDiEnumDeviceInterfaces(DevInfo,0,&HidGuid,Index,&DevData);if (!ok) break;/* Get Device Interface Details - Get Length */ok = SetupDiGetDeviceInterfaceDetail(DevInfo,&DevData,NULL,0,&Length,NULL);/* Allocate memory for Device Detailed Data */DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);/* Set cbSize in the DevDetail structure */DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);/* Get Device Interface Details */ok = SetupDiGetDeviceInterfaceDetail(DevInfo,&DevData,DevDetail,Length,NULL,NULL);if (!ok){free(DevDetail);DevDetail = NULL;continue;}/* Create File for Device Read/Write */DevHandle = CreateFile(DevDetail->DevicePath,0,FILE_SHARE_READ | FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,0,NULL);if (DevHandle == INVALID_HANDLE_VALUE){free(DevDetail);DevDetail = NULL;continue;}DevAttributes.Size = sizeof(DevAttributes);ok = HidD_GetAttributes(DevHandle, &DevAttributes);if (!ok){free(DevDetail);CloseHandle(DevHandle);DevDetail = NULL;continue;}if (find(vecVidPid.begin(), vecVidPid.end(), _VID_PID_(DevAttributes.VendorID, DevAttributes.ProductID)) == vecVidPid.end()){vecVidPid.push_back(_VID_PID_(DevAttributes.VendorID, DevAttributes.ProductID));free(DevDetail);CloseHandle(DevHandle);DevDetail = NULL;}} while (DevCount < 20);SetupDiDestroyDeviceInfoList(DevInfo);return;
}void CScannerDlg::OnCbnDropdownComboScanner()
{// TODO: 在此添加控件通知处理程序代码unsigned short* a;a = new unsigned short[100];memset(a, 0x00, 100);vecVidPid.clear();m_combo_scanner.ResetContent();HID_FindAllDevices(a);delete a;int i = 0;for (auto it = vecVidPid.begin(); it != vecVidPid.end(); it++){CString strTmp;strTmp.Format(_T("VID:%04x,PID:%04x"), it->V_ID, it->P_ID);m_combo_scanner.InsertString(i, strTmp);i++;}
}void CScannerDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码CString strTmp;int nSel = m_combo_scanner.GetCurSel();if (nSel != -1){strTmp.Format(_T("%04x"), vecVidPid.at(nSel).V_ID);gParams.SetVID(strTmp);strTmp.Format(_T("%04x"), vecVidPid.at(nSel).P_ID);gParams.SetPID(strTmp);gParams.SaveXml();}else{gParams.SetVID(_T("FFFF"));gParams.SetPID(_T("FFFF"));gParams.SaveXml();}CDialogEx::OnOK();
}

窗口展示

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

  1. Linux查看U盘的Vid,CheckUDisk(查看USB的VID/PID/厂商信息)v5.4

    CheckUDisk是一个免费的USB存储设备检测工具,能查看诸如USB存储设备名称.盘符.VID&PID.序列号.制造商信息.产品信息.版本.传输速度等连接到PC上的U盘信息.支持Win98 ...

  2. 解决同VID/PID usb设备驱动重复安装的问题

    电脑连接同型号usb设备不同机器会为每个设备都安装驱动,这样很麻烦,浪费时间.下面为解决方案: (1)每一台设备使用相同的SN,手机上用的sn一般是flash sn或设备写的sn号 (2)电脑端忽略设 ...

  3. OpenCV:如何获取摄像头的型号以及USB设备的VID和PID信息?

    VID和PID PID/VID唯一标识一个设备,HardwareID是为了给系统识别的 ,他是根据PID/VID而生成的.这个与序列号没什么关系,序列号一般都是厂家固化到芯片中的信息而已.GUID只是 ...

  4. 获取电脑USB设备VID和PID等信息。

    转自:[VC] 获取电脑USB设备VID和PID等信息. 1,添加头文件和宏定义 [cpp] view plain copy print ? #include <setupapi.h> # ...

  5. 浅谈USB设备的VID和PID

    亲测可用,若有疑问请私信 ​U盘的VID和PID分别是指Vendor ID(生产厂商ID) 和Product ID(产品ID). U盘的主控芯片决定了用什么量产工具.对于多数U盘来说,比如:金士顿.爱 ...

  6. 【GPS授时系列】通过USB接口获取PPS信号

    前言 本文翻译自Don Drawn的博客 https://blog.dan.drown.org/ 斜体是译者加的注释,方便读者理解 目标 为了获取精确时间,最划算的做法是从GPS模块同步PPS信号(秒 ...

  7. MFC 获取所有USB设备 列举所有USB设备 列举所有USB HUB

    获取所有USB设备,列举所有USB设备 #include <INITGUID.h>  #include <setupapi.h> #pragma comment(lib, &q ...

  8. iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

    手边有一闲置的linux开发板iMX6ULL一直在吃灰,不用来搞点事情,总觉得对不住它.业余打发时间就玩起来吧,总比刷某音强.从某多多上买来一个usb接口的游戏手柄,让开发板支持以下它,后续就可以接着 ...

  9. 禾瑞亚USB接口电阻触摸屏控制卡QNX 6.5 RTOS操作系统x86架构驱动安装与配置方法

    禾瑞亚USB接口电阻触摸屏控制卡QNX 6.5 RTOS操作系统x86架构驱动安装与配置方法 前提条件:安装QNX 6.5 RTOS操作系统的主板的USB接口必须能够被操作系统识别,否则连接不到触摸屏 ...

最新文章

  1. 使用 Python 在 Linux 上实现一键回归测试
  2. react 执行入口_如何使用React执行CRUD操作
  3. Pocket Gem OA: Path Finder
  4. rn代码与android,RN与原生通讯(安卓篇)
  5. 数据结构与算法之美-字符串匹配(上)
  6. Struts2实现通过浏览器返回一个helloworld页面给用户
  7. smtp发送邮件和pop3收取邮件
  8. Windows Server 2003 SP2 企业版 ISO 下载
  9. 50多款51单片机程序源码原理图编程源代码
  10. GEE开发之Landsat8计算MNDWI和数据分析
  11. 新联想ISG聚焦新IT,全要素推进企业智能化转型
  12. STKO助力OpenSEES系列:结构模态分析以及动力特性(MDOF与等效SDOF验证)
  13. comsol5.6下载
  14. BIGO前端一面面经
  15. table 表格边框线去重
  16. 不在同一局域网?组建家庭局域网的方案和踩坑
  17. 复现、修复和排查Spring RCE 0day
  18. 快手音乐公布版权生态建设阶段战报:音乐人总结算金额提升480%
  19. 图解Janusgraph系列-查询图数据过程源码分析
  20. python金融量化分析工资_量化金融分析师就业前景及薪酬怎么样?

热门文章

  1. 监控系统中的存储服务器的功能,监控系统的储存方法都有哪些,它们的区别是什么?...
  2. 【微信小程序】页面跳转的四种方式
  3. Python编程 字典创建
  4. VScode运行fs.readFile时报错no such file or directory或无法输出data或undefined
  5. 虚幻5 渲染视频序列视频轨的操作笔记
  6. 用coreldraw软件设计名片的步骤
  7. dbeaver 配置mysql数据库驱动
  8. Python 函数的了解与使用
  9. 6s换过sim卡后显示无服务器,苹果6s PLUS换卡后显示无sim卡怎么处理?
  10. favdb格式转换html,丢失360安全浏览器和360速度浏览器收藏夹的方法