// kb_getdeviceDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "kb_getdevice.h"
#include "kb_getdeviceDlg.h"
#include "afxdialogex.h"
// 包含设备安装类api
#include "setupapi.h"
// 包含GUID
#include "initguid.h"
#include <devguid.h>
#include <ntddkbd.h>
#pragma comment(lib,"setupapi.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CkbgetdeviceDlg 对话框
CkbgetdeviceDlg::CkbgetdeviceDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_KB_GETDEVICE_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CkbgetdeviceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CkbgetdeviceDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_GET_KB, &CkbgetdeviceDlg::OnBnClickedButtonGetKb)
END_MESSAGE_MAP()
// CkbgetdeviceDlg 消息处理程序
BOOL CkbgetdeviceDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
CListCtrl* list = (CListCtrl*)GetDlgItem(IDC_LIST_KB);
list->InsertColumn(0, _T("键盘设备路径"), LVCFMT_FILL, 500);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CkbgetdeviceDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CkbgetdeviceDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CkbgetdeviceDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CkbgetdeviceDlg::OnBnClickedButtonGetKb()
{
// TODO: 在此添加控件通知处理程序代码
if ( TRUE == GetKBDevicePath(m_listKB))
UpdateList();
}
/// <summary>
/// 更新 list control
/// </summary>
/// <param name=""></param>
void CkbgetdeviceDlg::UpdateList(void)
{
int i = 0;
CListCtrl* list = (CListCtrl*)GetDlgItem(IDC_LIST_KB);
list->DeleteAllItems();
//while (list->DeleteColumn(0));
for (auto device : m_listKB)
{
CString kb;
kb = device;
list->InsertItem(i++, kb);
}
}
/// <summary>
/// 获取本机所有键盘的设备路径列表
/// </summary>
/// <param name="listKB"></param>
/// <returns></returns>
BOOL CkbgetdeviceDlg::GetKBDevicePath(list<CString>& listKB)
{
// 根据设备安装类GUID创建空的设备信息集合
HDEVINFO deviceInfoSet;
deviceInfoSet = SetupDiCreateDeviceInfoList(&GUID_DEVCLASS_KEYBOARD, NULL);
if (deviceInfoSet == NULL) return FALSE;
// 根据设备接口类GUID获取新的设备信息集合
HDEVINFO deviceInfoElements = SetupDiGetClassDevsEx(
&GUID_DEVINTERFACE_KEYBOARD,
NULL,
NULL,
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT,
deviceInfoSet,
NULL,
NULL);
if (deviceInfoElements == NULL) return FALSE;
// 获取设备接口
uint32_t memberIndex = 0;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData = { 0 };
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
listKB.clear();
// 枚举所有键盘
while (SetupDiEnumDeviceInterfaces(deviceInfoElements,
NULL,
&GUID_DEVINTERFACE_KEYBOARD,
memberIndex++,
&deviceInterfaceData))
{
// 获取接口细节
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = 0;
DWORD length;
BOOL ok = SetupDiGetDeviceInterfaceDetail(deviceInfoElements,
&deviceInterfaceData,
NULL, 0, &length, NULL);
DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(deviceInfoElements,
&deviceInterfaceData,
DeviceInterfaceDetailData,
length,
NULL,
NULL))
{
// 获取设备路径
listKB.push_back(DeviceInterfaceDetailData->DevicePath);
}
free(DeviceInterfaceDetailData);
DeviceInterfaceDetailData = 0;
}
SetupDiDestroyDeviceInfoList(deviceInfoElements);
if (listKB.size() == 0)
return FALSE;
else
return TRUE;
}
没有合适的资源?快使用搜索试试~ 我知道了~
vc 获取所有键盘类设备 示例代码
共17个文件
h:6个
cpp:3个
vcxproj:1个
需积分: 0 0 下载量 106 浏览量
2023-10-13
14:15:10
上传
评论
收藏 68KB 7Z 举报
温馨提示
测试环境 vs2019 x86 获取所有键盘类设备 http://t.csdnimg.cn/IYR8k
资源推荐
资源详情
资源评论
收起资源包目录
kb_getdevice.7z (17个子文件)
kb_getdevice
kb_getdevice.vcxproj.filters 2KB
kbgetdevice.aps 107KB
kb_getdevice.h 510B
kb_getdevice.sln 1KB
resource.h 782B
framework.h 2KB
res
kbgetdevice.rc2 678B
kb_getdevice.ico 66KB
pch.h 544B
kb_getdevice.vcxproj.user 237B
kb_getdeviceDlg.h 884B
kb_getdevice.vcxproj 10KB
pch.cpp 158B
kbgetdevice.rc 11KB
kb_getdeviceDlg.cpp 6KB
kb_getdevice.cpp 3KB
targetver.h 295B
共 17 条
- 1
资源评论
bugmoo
- 粉丝: 12
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab开发的根据rvm回归模型自己编的matlab程序.rar
- 高效C++学生成绩管理系统:教育技术+C++17编程+数据管理+教务自动化
- 基于matlab开发的Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行.rar
- 一个点击正反转程序实例,可实现案件电机正反转
- 搜索链接淘特搜索引擎共享版-tot-search-engine.rar
- 第十八届全国大学生智能汽车竞赛 摄像头组/镜头组
- 基于matlab开发的AUV惯性导航系统matlab仿真程序,包括轨迹生成、gps和sins组合、gps和dvl组合.rar
- 基于SSM的“个性化电子相册”的设计与实现.zip
- 如何在撰写科研文献时,使用ai工具辅助去完成科研工作
- 吉林大学计组笔记 自用 基于b站翼云图灵的课.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功