虚拟键盘鼠标UVKM通讯协议接口
			 2023-06-12
			  543
			 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    
		 USB虚拟键盘鼠标UVKM
			USB虚拟键盘鼠标UVKM




