主要实现了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();
}