USB中文网出品-HID虚拟全局坐标鼠标
2021-12-21
1461
0
以往我们的鼠标指针移动都是相对当前的坐标进行移动,如果要移动到指定的位置,需要不停地获取当前应用层的鼠标指针进行逼近,这样实现鼠标的定位移动或者按下等动作。
但是在实际的USB鼠标分类中,还存在另一种鼠标类型,叫做全局坐标鼠标类型,即通过在指定相关的XY坐标进行相应的鼠标动作,其实现原理也和触摸屏类似,通过指GLOBA_LOCICAL_MAXIUM和GLOBA_LOCICAL_MINUM来指定逻辑坐标系,在实际的使用时根据当前分辨率进行坐标系等比例折算。这种全局坐标系的鼠标相对于我们相对的鼠标,在实际生产使用上其实更加的简单,更利于自动化挂机测试。
本人基于本站的全局鼠标HID报告描述符,在原来相对鼠标的工程上,虚拟了一个全局坐标系虚拟鼠标,其在设备管理器中如下图所示:
我们通过应用程序向驱动中下发测试鼠标点击数据:
而应用层我封装了2个很简单的函数,一个用于左键,一个用于右键,至于中间我没有写,因为一般也不用。
typedef struct _GMOUSE_STRUCT
{
UCHAR ReportId;
UCHAR Button;
USHORT X;
USHORT Y;
}GMOUSE_STRUCT;
而驱动的安装,还是沿用以前的方式,使用了一个批处理文件实现:
CD /d %~dp0
devcon.exe install UsbzhGVMouse.inf "root\UsbzhGVMouse"
至于报告描述符,本站沿用的是报告描述符专栏中的数据,我没有做任何变动,通过我写的HID报告描述符分析工具。
测试代码
/*
GMouseText.exe LeftClick x y
GMouseText.exe RightClick x y
*/
int main(int argc,char* argv[])
{
int nWidth = GetSystemMetrics(SM_CXSCREEN);
int nHeight = GetSystemMetrics(SM_CYSCREEN);
printf("your srceen is %d x%d\n", nWidth, nHeight);
if (argc< 4)
{
printf("usage\n");
printf("\tGMouseText.exe LeftClick x y \n");
printf("\t GMouseText.exe RightClick x y\n");
return -1;
}
TCHAR DeviceName[512] = { 0 };
if (!CUsb::USBEnumDevice(DeviceName, 0))
{
printf("please install dten gmouse driver\n");
return -1;
}
int x = atoi(argv[2]);
int y = atoi(argv[3]);
x = x * LOGICAL_MAX_WIDTH/ nWidth;
y = y * LOGICAL_MAX_HEIGHT/ nHeight;
GMOUSE_STRUCT mt;
mt.ReportId = 2;
mt.X = x;
mt.Y = y;
if (strcmp(argv[1], "LeftClick") == 0)
{
mt.Button = 1;
}
else if (strcmp(argv[1], "RightClick") == 0)
{
mt.Button = 2;
}
else
{
printf("usage\n");
printf("\tGMouseText.exe LeftClick x y \n");
printf("\t GMouseText.exe RightClick x y\n");
return -1;
}
CUsb usb;
if (!usb.UsbOpenDevice(DeviceName))
{
printf("open usb gmouse device err\n");
return -1;
}
ULONG rtn = 0;
usb.SetMouseData(&mt, sizeof(mt), &rtn);
mt.Button = 0;
Sleep(10);
usb.SetMouseData(&mt, sizeof(mt), &rtn);
usb.UsbClose();
return 0;
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936