虚拟键盘鼠标UVKM通讯协议接口
2023-06-12
406
0
虚拟键盘鼠标UVKM使用的是一个标准的自定久HID接口来发送数据给键盘、鼠标。而发给不同的设备使用不同的ReportId来区分。
键盘报告协议
typedef struct _KEYBOARD_STRUCT
{
UCHAR ReportId;//A1
union
{
UCHAR Value;
struct
{
UCHAR LeftCtrl : 1;
UCHAR LeftShift : 1;
UCHAR LeftAlt : 1;
UCHAR LeftGui : 1;
UCHAR RightCtrl : 1;
UCHAR RightShift : 1;
UCHAR RightlAlt : 1;
UCHAR RightGui : 1;
}u;
}Fun;
UCHAR Reserved;
UCHAR Key[6];
}KEYBOARD_STRUCT;
普通鼠标报告协议
typedef struct _MOUSE_STRUCT
{
UCHAR ReportId;//A0
union
{
UCHAR Value;
struct
{
UCHAR LeftBtn : 1;
UCHAR RightBtn : 1;
UCHAR Reseved : 6;
}u;
}btn;
UCHAR Horizontal;
UCHAR Veritical;
UCHAR Wheel;
}MOUSE_STRUCT;
全局坐标鼠标报告协议
typedef struct _GMOUSE_STRUCT
{
UCHAR ReportId; //A2
union
{
UCHAR Button;
struct
{
UCHAR LeftBtn : 1;
UCHAR RightBtn : 1;
UCHAR Reseved : 6;
}u;
}btn;
USHORT X;
USHORT Y;
}GMOUSE_STRUCT;
自定义HID输入报告
自定义HID的通讯协议如下:
typedef struct _HID_STRUCT
{
UCHAR ReportId;//0x05
UCHAR DataLen;//数据有效长度,最大254
UCHAR Data[254];//数据缓冲区
}HID_STRUCT,*PHID_STRUCT;
其中数据缓冲区填充键盘、或鼠标的输入报告,而DataLen为数据的有效长度,其负载ReportId固定为0x05.
我们可以对发送自定义HID的接口进行封装:
BOOL CHid::SetReport(PVOID pData, ULONG nLen)
{
if (nLen > 254)
{
return FALSE;
}
UCHAR data[256] = { 0 };
data[0] = 0x05; //ID
data[1] = nLen; //length
CopyMemory(&data[2], pData, nLen);
ULONG rtn = 0;
return WriteFile(m_hDeivce, data, sizeof(data), &rtn, NULL);
}
而上面的pData和nLen就是KEYBOARD_STRUCT、GMOUSE_STRUCT或MOUSE_STRUCT的指针和其结构体的大小。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936