主要实现了C++里的GetAsynckeyState(VK_NAME)方法来监控鼠标的操作状态,然后利用GetCursorPos(LPPOINT lp)来获取鼠标位置,最后读取录制的操作数据,进行操作重放;
下载链接:https://download.csdn.net/download/qq_42799236/12562298

使用说明

工具的使用比较简单粗暴,第一次运行请先打开如图(鼠标脚本1.0.exe)文件,会出现下图模式选择界面代表运行成功,如果报错请先运行资源里的(环境配置.bat)文件;

第二步先进行鼠标操作的录制,输入1按回车确认,即选择模式1.录制脚本:

出现上图则意味着工具已经开始记录你的鼠标操作并存储,目前暂不支持模拟鼠标拖拽和鼠标右键活动,其它单击或双击操作将被记录:

如图,当你确定自己鼠标操作结束后,按键盘左上角的ESC键结束录制,工具将统计你的操作数和用时;
录制好了你所需要的操作,下面关闭工具重新打开,并输入2按回车选择执行刚刚录制的脚本;
下一步便是要确认一下你想要执行多少次刚刚的操作,以及每次执行完休息多久,单位为秒,按回车确认:

注意事项:
①重新录制脚本将覆盖先前录制的脚本,如果要进行备份,请将bin目录里的data.dat文件备份在其它文件夹里,重新录制脚本将生成新的data.dat文件,如果要执行任意备份脚本,只要把它的data.dat文件放回bin目录里;
②工具里的文件夹或者文件都是必要的,大小并不大,如果删除将导致工具运行失败;

C++源码

#include<iostream>
#include<windows.h>
#include<fstream>
#include<time.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;typedef struct act{//定义存储鼠标操作信息的结构体对象;
long x;
long y;
long t;
}action;action aa [500]; //定义操作数组;
int count = 0;     //操作计数;
int k=1;       //循环计数
float cost = 0.0;//脚本总耗时
int delay=3; //接收脚本延时
int num = 0; //接收脚本次数void store(){//定义存储操作的方法;POINT ptB = {0,0};   //获取鼠标坐标;LPPOINT xy = &ptB;GetCursorPos(xy);long x = xy->x;long y = xy->y;SYSTEMTIME sys;//获取当日经过毫秒数;GetLocalTime(&sys);long h = sys.wHour*60*60*1000;long m = sys.wMinute*60*1000;long s = sys.wSecond*1000;long ms = sys.wMilliseconds;long t =0;t = h+m+s+ms;struct act temp;//创建操作对象;temp.x=x;      //存储鼠标坐标,当日用时;temp.y=y;temp.t=t;if(count == 0){aa[count] = temp;printf("x=%d,y=%d,t=%d,count=%d 第一次操作存入成功!\n",aa[count].x,aa[count].y,aa[count].t,count);count++;}if((temp.x==aa[count-1].x)&&(temp.t-aa[count-1].t<120)){//过滤同点时间间隔过短的点击}else {aa[count] = temp;printf("x=%d,y=%d,t=%d,count=%d 操作存入成功!\n",aa[count].x,aa[count].y,aa[count].t,count);count++;//记录最后一次操作时也进行了count++,所以总操作数为count;}
}void out(){//定义数据输出文件方法ofstream outfile;outfile.open("data.dat",ios::trunc);int i ;outfile << count <<endl;for(i = 0;i<count;i++){outfile << aa[i].x << " " <<aa[i].y<< " "<< aa[i].t <<endl; }outfile.close();
}
void initial(){cout<<"-------------------------------------------------\n";cout<<"请输入脚本需要循环的次数:(输入0为无限循环)\n";cin>>num;cout<<"请输入脚本每次循环后休息时间,(按回车确认,建议不要设置为0)\n";cin>>delay;printf("配置成功!脚本将循环%d次,每次循环后休息%d秒:\n",num,delay);Sleep(1000);cout<<"----------------下面开始执行脚本------------------\n";
}void in(){//定义从文件读取数据方法ifstream infile;infile.open("data.dat");int i;infile >> count;for(i =0;i<count;i++){infile >> aa[i].x;infile >> aa[i].y;infile >> aa[i].t;
}//将每个结构体的t存放休眠时间;for(i = 0;i<count;i++){if(i==(count-1)){aa[i].t=0;}else{aa[i].t=aa[i+1].t-aa[i].t;cost = cost+aa[i].t;}}infile.close();
}int fun_1(){//录制操作while (true){//循环监控鼠标按键情况
if(KEY_DOWN(VK_LBUTTON)){//调用存储方法将本次操作进行存档;store();}
if(KEY_DOWN(VK_ESCAPE)){//调用输出方法进行全部操作存为文件;out();cout<<"-------------------------------------------------\n";printf("录制结束!共录制了%d个操作,耗时%d毫秒!\n",count,(aa[count-1].t-aa[0].t));printf("如要执行刚刚录制脚本,请重新运行本工具并选择模式2!\n");return 0;}
Sleep(20);//循环时间间隔,防止太占内存}
}int fun_2(){//执行操作int i;for(i = 0;i<count;i++){SetCursorPos(aa[i].x,aa[i].y);mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);printf("执行第%d步完毕!\n",i+1);Sleep(aa[i].t);if(KEY_DOWN(VK_ESCAPE)){cost=cost*(k-1)+delay*(k-1);while(i!=-1){cost=cost+aa[i].t;i--;}cout<<"-------------------------------------------------\n";printf("脚本提前结束!共执行了%d次脚本,耗时%.3f秒\n",k,cost/1000.0);k=0;return 0;}    }return 0;
}void choose(){cout << "请选择运行模式:"<< "(输入1或2进行选择,按ENTER回车确认选择)\n"<<"1.录制脚本\n"<<"2.执行脚本\n";char ch;switch(ch = getchar()){case '1':{system("cls");cout<< "您选择录制脚本,下面开始录制鼠标操作:(按ESC结束录制)\n";cout<<"-------------------------------------------------\n";fun_1();break;}case '2':{system("cls");cout<< "您选择执行脚本,下面请先进行一些配置.\n";in();initial();while(k){fun_2();if(k==0||k==num) break;printf("第%d次循环执行完毕,%d秒后进入下一循环!(提前结束请长按ESC或关闭本窗口)\n",k,delay);k++;Sleep(1000*delay);}if(num!=0&&k==num){cout<<"-------------------------------------------------\n";cost=cost*num+delay*1000*(num-1);printf("第%d次循环执行完毕,总耗时%.3f秒,脚本停止执行。\n",num,cost/1000.0);}}}system("pause");
}int main(){cout << "欢迎使用,鼠标脚本工具开始运行!\n";cout<<"-------------------------------------------------\n";choose();
}

【C++】一个简单的模拟实现鼠标脚本精灵相关推荐

  1. easy-mock写的一个简单的模拟二页的反馈

    用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...

  2. java编写一个简单的模拟抽奖程序

    //郑州轻工业大学 //题号:实验一 第四题 //题目: 编写一个简单的模拟抽奖程序(模拟抽奖1.0),抽奖时需要输入5个116的整数号码,每个号码不能重复.程序运行后会随机生成5个116幸运号码,然 ...

  3. 【Unity3D】10行代码实现一个简单的角色移动旋转脚本

    一.前言 今天分享一个简单的角色移动脚本,主要用到碰撞器和刚体组件,代码简单易懂,复用性.扩展性较强,跟我一起来看看吧. 二.效果图 三.代码 using UnityEngine;public cla ...

  4. java 模拟鼠标_java实现简单的模拟键盘鼠标操作

    简简单单的记录: 近期需要用到模拟键盘鼠标操作,所以记录下来,以备后用,看了很多例子,未标明引用,请见谅 package com.text.jna; import javax.imageio.Imag ...

  5. (python)实现一个简单的图片文字识别脚本

    文章目录 截图 文字识别## 访问剪切板 总结 快毕业了,除了准备答辩之外,就是看看书,各种瞎晃~ 那么,这两天在看书的时候遇到这么个问题: 首先,部分电子版的书籍是以扫描图片的形式展现的,在阅读过程 ...

  6. 一个简单的网路测试bat脚本

    使用方法: 1:把需要测试地址的ip地址写入ip.txt 2:执行脚本 3:文本需要和脚本在一个目录 代码如下: @echo off echo 地址 丢包数 平均时间 (for /f "us ...

  7. python3写一个计算器_Python3 写了一个简单的模拟计算器 总是报错 有知道的大神 帮忙解答下 非常感谢...

    先上代码复制粘贴就可以运行了```#_*_coding:utf-8_*_importsysdefadd():returnnum1+num2defsubtract():returnnum1-num2de ...

  8. [转载]C#模拟键盘鼠标事件-SendKeys

    C#模拟键盘鼠标事件-SendKeys 2007-09-18 15:138596人阅读评论(1)收藏举报 1.模拟键盘事件 System.Windows.Forms.SendKeys以下是   Sen ...

  9. 计算机控制电机启动接线图,用PC机并口控制一个简单电路

    所谓PC机并口控制,就是要用打印机接口来控制一些外部设备,达到自动化的目的.如学校早操及课间操音乐的自动播放.公共场所照明的自动控制.小型的彩灯的控制.按照课程表进行自动打铃.简易机械加工设备的自动控 ...

最新文章

  1. Nature子刊:微生物来源分析包SourceTracker——结果解读和使用教程
  2. c语言 常量字符串数组,C语言常量以及字符串数组
  3. [AngularJS]Chapter 1 AnjularJS简介
  4. Python-关于正则表达式的总结
  5. Java访问修饰符——用于控制可见性
  6. Spring学习之旅(三)之运行值时注入
  7. Exchange 2010与Exchange Online混合部署PART 3:混合准备
  8. Python漫画下载器V2,进行更好的封装,更高效的多线程与刷新机制
  9. Java | Java模拟实现扑克牌洗牌、发牌过程
  10. 真爱至上Love Actually
  11. CSP 201712-4 行车路线(100)
  12. 美多商城之短信验证码
  13. Kali Linux渗透测试——信息收集
  14. Unlocker 1.8.5
  15. 1、WebApi简介
  16. 语音对讲软件_转发信息效率太低?还不赶紧使用微信语音转播软件?
  17. 雷军做互联网需7字诀
  18. java构造函数有几种_java构造函数的三种类型总结
  19. android手机助手排名,2019手机份额排行_2019安卓手机助手排行榜Top10
  20. 物理实验引发的思考:总体标准偏差和样本标准偏差的区别是什么?标准偏差和标准误的区别是什么?

热门文章

  1. 关于文献阅读和寻找新的科研题目
  2. 春节祝福短信怎么发?付详细文案
  3. 做SEO优化第六步:设置Title、keywords和Description
  4. 【stgcn】代码解读之主函数(一)
  5. 腾讯安全联手知道创宇应对全球勒索攻击事件
  6. mongo-go-driver 踩坑心得 server selection error
  7. 微信又更新了,这次新增了一个大家喜闻乐见的新功能?
  8. 2020年西式面点师(高级)考试题及西式面点师(高级)考试内容
  9. js中toString用法
  10. 第五章-语法分析之抽象语法树的建立