其中鼠标全局位置信息描述符是哪个
时间: 2023-09-18 09:10:20 浏览: 143
鼠标全局位置信息描述符是HID鼠标描述符中的一个字段,它定义了鼠标设备的全局位置信息。它通常包括了鼠标设备的最小和最大坐标值、坐标值的分辨率、坐标轴的方向等信息。鼠标全局位置信息描述符在报告描述符中的位置是固定的,通常是在第一条输入报告中的第二个字节。通过解析鼠标全局位置信息描述符,操作系统可以正确地映射鼠标设备的坐标值,并将其转换为屏幕上的像素值,从而实现鼠标的准确控制。
相关问题
HID鼠标全局位置描述符在哪里
HID鼠标全局位置描述符是在鼠标的HID报告描述符中定义的。在USB HID规范中,每个HID设备都需要定义一个HID报告描述符,其中包含设备的全局描述符、输入报告描述符和输出报告描述符。而鼠标的HID报告描述符中,全局描述符描述了鼠标设备的全局属性,包括厂商标识、产品标识、设备版本号等信息。其中,鼠标的全局位置描述符描述了鼠标的坐标轴信息,包括X轴和Y轴的分辨率、最小值、最大值等。
在HID报告描述符中,全局位置描述符通常会紧跟在全局描述符之后,具体的格式如下:
```
typedef struct {
uint8_t bDescriptorType; // 描述符类型,固定为0x06
uint16_t wDescriptorLength; // 描述符长度,字节数
// 全局属性
uint8_t bcdHID; // HID协议版本号
uint8_t bCountryCode; // 国家代码
uint8_t bNumDescriptors; // HID类描述符数量
// HID类描述符列表
struct {
uint8_t bDescriptorType; // 描述符类型,固定为0x22
uint16_t wDescriptorLength; // 描述符长度,字节数
// 鼠标的全局位置描述符
uint8_t bDescriptorType2; // 描述符类型,固定为0x24
uint8_t bDescriptorLength; // 描述符长度,字节数
uint16_t wReportCount; // 报告数量
// X轴坐标信息
uint8_t bDescriptorType3; // 描述符类型,固定为0x25
uint8_t bDescriptorLength2; // 描述符长度,字节数
uint8_t bSize; // 数据位数
uint8_t bReportCount; // 报告数量
int8_t bLogicalMinimum; // 逻辑最小值
int8_t bLogicalMaximum; // 逻辑最大值
uint8_t bPhysicalMinimum; // 物理最小值
uint8_t bPhysicalMaximum; // 物理最大值
// Y轴坐标信息
uint8_t bDescriptorType4; // 描述符类型,固定为0x25
uint8_t bDescriptorLength3; // 描述符长度,字节数
uint8_t bSize2; // 数据位数
uint8_t bReportCount2; // 报告数量
int8_t bLogicalMinimum2; // 逻辑最小值
int8_t bLogicalMaximum2; // 逻辑最大值
uint8_t bPhysicalMinimum2; // 物理最小值
uint8_t bPhysicalMaximum2; // 物理最大值
} HIDDescriptorList[bNumDescriptors];
} HIDDescriptor;
```
可以通过解析该结构体来找到鼠标的全局位置描述符的位置及其属性值。其中,bDescriptorType字段的值为0x06,表明这是一个全局描述符;wDescriptorLength字段表示该描述符的长度;bcdHID字段表示HID协议版本号;bCountryCode字段表示国家代码;bNumDescriptors字段表示HID类描述符的数量;HIDDescriptorList数组则包含了所有的HID类描述符。可以在HIDDescriptorList数组中搜索bDescriptorType字段的值为0x22的项,以找到鼠标的HID类描述符。在鼠标的HID类描述符中,可以查找bDescriptorType字段的值为0x24的项,以找到鼠标的全局位置描述符。在全局位置描述符中,可以查找bDescriptorType字段的值为0x25的项,以获取X轴和Y轴坐标的详细信息。
我想在上面那段HID描述符中获取到鼠标的全局位置信息,我该怎么获取
在 HID 描述符中,鼠标的 X/Y 坐标值是使用相对坐标表示的,需要通过解析输入报告数据,才能得到鼠标的全局位置信息。
具体步骤如下:
1. 根据 HID 描述符中定义的输入报告格式,解析鼠标的输入报告数据,获取其中的 X/Y 坐标值。
2. 获取当前屏幕的 DPI 值,可以使用 GetDpiForSystem 函数获取系统 DPI 值。
3. 将相对坐标转换为绝对坐标,使用公式:绝对坐标 = 相对坐标 * DPI / 96。
示例代码如下:
```c++
#include <Windows.h>
#include <iostream>
#include <vector>
// HID Report Id
const BYTE HID_RPT_ID_MOUSE_IN = 0x01;
// 鼠标输入报告格式
struct MouseInputReport {
BYTE ReportId;
BYTE ButtonState;
SHORT X;
SHORT Y;
};
int main()
{
// 打开 HID 设备
HANDLE hDevice = CreateFile(
L"\\\\?\\HID#VID_XXXX&PID_XXXX&MI_XX#X&XXXXXXX&0&XXXX#{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
std::cout << "Failed to open HID device" << std::endl;
return 1;
}
// 获取当前屏幕的 DPI 值
HDC hdc = GetDC(NULL);
int dpi = GetDeviceCaps(hdc, LOGPIXELSX);
ReleaseDC(NULL, hdc);
// 读取鼠标输入报告
MouseInputReport report;
DWORD bytesRead;
std::vector<BYTE> buffer(sizeof(MouseInputReport) + 1);
buffer[0] = HID_RPT_ID_MOUSE_IN;
if (!ReadFile(hDevice, &buffer[0], buffer.size(), &bytesRead, NULL)) {
std::cout << "Failed to read HID input report" << std::endl;
CloseHandle(hDevice);
return 1;
}
if (bytesRead == sizeof(MouseInputReport) + 1 && buffer[0] == HID_RPT_ID_MOUSE_IN) {
memcpy(&report, &buffer[1], sizeof(MouseInputReport));
// 转换为绝对坐标
int absX = report.X * dpi / 96;
int absY = report.Y * dpi / 96;
std::cout << "Mouse position: (" << absX << ", " << absY << ")" << std::endl;
}
CloseHandle(hDevice);
return 0;
}
```
注意,这里的 HID 设备路径需要根据实际情况进行修改,具体路径可以通过设备管理器中查看 HID 设备的属性获得。
阅读全文