Win10使用虚拟USB鼠标实现自动挂机测试功能

2021-07-09 6465 34

昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。

本以为是一个很简单的东西,没想到还是弄出了花样。

初始版本 - 脚本方案

第一想法本是想通过批处理实现,无奈没有找到相应的鼠标功能接口,只好放弃。
第二想法是通过python实现,发现网上的代码不知道是版本问题还是别的,就是无法运行。模块无法识别,使用PIP安装库时需要更新python,竟把python环境给升挂了。算了,懒地弄了,就此放弃此方案。
网上下的代码版本1

  1. import win32api
  2. def shubiao(x,y):
  3. win32api.SetCursorPos([x,y])
  4. # 鼠标点击
  5. win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
  6. # time.sleep(1)
  7. win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
  8. # time.sleep(1)
  9. # print("dianji_shubiao")
  10. shubiao(100,200)

网上下的代码版本2

  1. from ctypes import *
  2. import time
  3. time.sleep(5)
  4. for i in range(1,5):
  5. windll.user32.SetCursorPos(900,50);
  6. windll.user32.SetCursorPos(900,300);
  7. windll.user32.mouse_event(windll.user32.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
  8. windll.user32.mouse_event(windll.user32.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
  9. time.sleep(1)

第二版本 - 应用程序模拟事件方案

上面的功能无法实现,只好自己写一个应用。
使用wind32提供的API接口实现,如实现在某个位置点击的代码

  1. void DoClick(int x, int y)
  2. {
  3. SetCursorPos(x, y);
  4. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  5. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  6. }

为了后续的调试的配置方便,自己这个应用运行时读取script.txt文件中的内容,然后解析脚本,执行。
自己定义的命令就几个:
script.txt

  1. loop 10
  2. move 100,200
  3. sleep 100
  4. click 120,432

然后使用C进行解析执行:

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <stdio.h>
  4. #include <vector>
  5. enum ENUM_ACTION
  6. {
  7. ACTION_MOVE =0,
  8. ACTION_CLICK,
  9. ACTION_SLEEP
  10. };
  11. typedef struct _ACTION_STRUCT
  12. {
  13. ENUM_ACTION action;
  14. int x;
  15. int y;
  16. int sleep;
  17. }ACTION_STRUCT,*PACTION_STRUCT;
  18. void DoMove(int x, int y)
  19. {
  20. SetCursorPos(x, y);
  21. }
  22. void DoClick(int x, int y)
  23. {
  24. SetCursorPos(x, y);
  25. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  26. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  27. }
  28. void DoSleep(int x)
  29. {
  30. Sleep(x);
  31. }

编译运行,使用多命令运行程序拾取各个按钮的坐标后,编写真正使用脚本,然后执行运行。一切都是很美好,自己看了一会后,发现有的时候偶尔有问题(见注释),不过下一次执行的时候好了。

前面的软件运行了大概2个小时就不行了,又是晚上,所以整个晚上挂了一个寂寞。

注释:出现的问题是由于我们的产品是大屏,软件并且是全屏运行的,需要在屏幕点击一击鼠标或者触摸屏时才弹出操作界面,然后再在操作界面中点击对应的按钮弹出相应的选择菜单,然后再在菜单中选择对应的关闭按钮。不过由于这是一系列的连贯操作,前几次还可以正常弹出选择菜单,后面的就不弹出了。

一旦出现关闭失败后,后面就是大概率就不再成功了。可能的问题是由于是全屏,默认隐藏鼠标,但是只发送鼠标事件,又没见相应的鼠标动作(如移动),事件发生后系统又要隐藏鼠标指针,导致前面的事件被湮灭。

终极方案- 真实的“鼠标”方案

想着即然鼠标事件不行,那不如来个“真正”的鼠标,有移动轨迹,有操作。
前一段时间使用Windows驱动虚拟了一个USB HID鼠标功能,对这个驱动加以利用,不就可以了吗?就干就干。

整个方案的框架如下:
真实的“鼠标”方案

首先对鼠标的事件进行封装,这里我发的是鼠标的报表内容:
描述符的内容解析可见:USB鼠标HID报告描述符数据格式分析 http://www.usbzh.com/article/detail-327.html

  1. void CVMouseDlg::MouseLeft()
  2. {
  3. ULONG rtn = 0;
  4. UCHAR data[4] = { 0x00,0xFF,0x00,0x00 };
  5. m_usb.SetMouseData(data, 4, &rtn);
  6. }
  7. void CVMouseDlg::MouseRight()
  8. {
  9. ULONG rtn = 0;
  10. UCHAR data[4] = { 0x00,0x01,0x00,0x00 };
  11. m_usb.SetMouseData(data, 4, &rtn);
  12. }
  13. void CVMouseDlg::MouseUp()
  14. {
  15. ULONG rtn = 0;
  16. UCHAR data[4] = { 0x00,0x00,0xff,0x00 };
  17. m_usb.SetMouseData(data, 4, &rtn);
  18. }
  19. void CVMouseDlg::MouseDown()
  20. {
  21. ULONG rtn = 0;
  22. UCHAR data[4] = { 0x00,0x00,0x01,0x00 };
  23. m_usb.SetMouseData(data, 4, &rtn);
  24. }
  25. void CVMouseDlg::MouseLeftClickDown()
  26. {
  27. ULONG rtn = 0;
  28. UCHAR data[4] = { 0x01,0x00,0x000,0x00 };
  29. m_usb.SetMouseData(data, 4, &rtn);
  30. }
  31. void CVMouseDlg::MouseLeftClickUp()
  32. {
  33. ULONG rtn = 0;
  34. UCHAR data[4] = { 0x00,0x00,0x000,0x00 };
  35. m_usb.SetMouseData(data, 4, &rtn);
  36. }

由于鼠标的相对移动,所以为了移动鼠标到具体的位置,进行代码封装:

  1. void CVMouseDlg::DoMove(int x, int y)
  2. {
  3. POINT pt;
  4. GetCursorPos(&pt);
  5. do
  6. {
  7. if (x > pt.x)
  8. {
  9. MouseRight();
  10. }
  11. else if (x < pt.x)
  12. {
  13. MouseLeft();
  14. }
  15. if (y > pt.y)
  16. {
  17. MouseDown();
  18. }
  19. else if (y < pt.y)
  20. {
  21. MouseUp();
  22. }
  23. Sleep(1);
  24. GetCursorPos(&pt);
  25. printf("%d,%d\n", pt.x, pt.y);
  26. if (x == pt.x && y == pt.y)
  27. {
  28. break;
  29. }
  30. } while (1);
  31. }

虚拟的鼠标:
虚拟的鼠标

应用程序的软件界面:
应用程序的软件界面

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
为什么Windows7重新安装系统后插在USB3.0端口的鼠标不能使用?
在 Windows 7 及更早版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供,操作系统不提供USB3.0驱动栈。 因此,Windows7重新安装系统后插在USB3.0端口上的所有设备都无法工作,需要安装第三方提供的USB控制器和集线器驱动,这样才能识别出挂接在该USB总线下的设备。从Wi......
HID 报表描述符鼠标实例
USAGE_PAGE (Generic Desktop) 05 01USAGE (Mouse) 09 02COLLECTION (Application) A1 01 ......
Win10使用虚拟USB鼠标实现自动挂机测试功能
昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。本以为是一个很简单的东西,没想到还是弄出了花样。初始版本 - 脚本方......
USB鼠标HID全局坐标报表描述符
常用的USB HID鼠标是相对的描述符,鼠标的移动是相对当前位置的相对移动。如相对当前位置左移,右移等。这种相对的坐标描述符有的时候在使用上有一定麻烦的,最重要的原因就是需要计算鼠标指针的当前位置。如本人之前做的一个USB鼠标挂机测试脚本,内容详见:http://www.usbzh.com/ar......
HID复合设备(键盘、鼠标)的实现
在使用一些USB键盘或鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘,鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
Windows下通过USB虚拟的键盘鼠标总结
产品级详见:https://www.usbzh.com/article/detail-1182.html哐哐铛铛的,终于把以前搞的虚拟键盘、鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟的键盘和鼠标整合到一个驱动中。将键盘和鼠标的代码合并在一起的原因很简单:第一是为了验证自己写的这个虚......
Windows虚拟UAC麦克风增加特性单元的开发调试笔记
昨晚突然接到通知,需要增加对UAC麦克风设备音量增益的控制。我努力地回忆了去年12月份自己粗略地整理的UAC规范,发布于http://www.usbzh.com/article/forum-1.html想着今天完成应该是美好的周五,会心满意足地完成工作,然后美美地打卡下班。可没想到就这么一个简单的......
Win10 x64虚拟设备之触摸屏
前一段时间在本人整理了自己编写的USB虚拟驱动框架,在其基础上实现了虚拟键盘,鼠标的功能。本节是继虚拟键盘鼠标的另一个虚拟USB设备-触摸屏触摸屏设备是HID设备的一个小类,但是随着触摸设备使用的越来越广泛,这类设备也变地越来越重要。触摸屏设备的原理和我们手机上的触摸屏原理一样,是在电脑屏幕上有一层......
HID设备虚拟触摸屏上报的多点数据系统不响应
前一般时间在Windows10下使用USB驱动虚拟了一个触摸屏设备,上层软件按照HID报告述符的格式下发触摸屏数据给驱动,再由驱动将数据上交给系统,实现虚拟触摸屏的功能。今天,突发奇想,上次的报告描述符仅支持的是一个点触摸效果,今天保不实现了一下多点触摸效果,所以我通过在一个支持多点触摸屏的设备......
Win10 x64下USB-UAC虚拟声卡扬声器的实现
UsbzhVSpeaker虚拟声卡下载地址: http://www.usbzh.com/article/detail-1076.html去年的时候,使用portclass驱动模型在windows下虚拟了一个虚拟扬声器和虚拟麦克风。扬声器和麦克风在内部通过拓扑结构进行数据关联,即麦克风的数据的来......
Windows下虚拟USB设备数据的读写请求调试笔记
到现在为止,本人已经在Windows下确切来说是Windows10 x64下开发了以下USB虚拟USB设备:USB虚拟UVC摄像头设备USB虚拟UAC麦克风设备USB虚拟HID键盘设备USB虚拟HID鼠标设备USB虚拟HID键盘鼠标复合设备USB虚拟HID单点触摸屏设备USB虚拟HID多点触摸屏......
Win10 x64下USB-UAC虚拟麦克风的实现
对于虚拟的UAC设备,实现了虚拟的UAC扬声器,总是想着再一个USB虚拟的UAC麦克风。因为这样,才算完美。本着完了完美的结果,自己又忍不住给自己找了一个活-USB虚拟麦克风虚拟麦克风的大体开发和USB虚拟扬声器类似,只是一个是输入设备,另一个是输出设备而已。所以参考UAC规范,基于UAC虚拟扬声......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!