关于C语言+WINAPI连点器的那些事
1.概述
游戏或是生活中不可缺少的一部分,但是重复度过高,难免会过于无聊。但是当为了某件装备或其他时,又不得不重复刷一个副本。这时候如果鼠标能自己点一个点或多个点来实现自动刷副本岂不是美哉,装备拿到了,还能把多出来的时间拿去干一点其他特别的事,比如说发一篇博文。或者是去了解一下战国李牧镇守边边塞的事,谁知道呢对吧?当然这个就是我们常说到的连点器,当然连点器也分物理连点和法术连点(软件);今天咋们就来聊聊电脑连点器。
2.方法原理
连点器的实现原理其实很简单,调用现成的win提供的api即可实现(linux不知道,未做了解)。
今儿咋们先简单介绍一下一个简单的连点器需要用到的相关函数
函数--1
函数--2
函数--3
大概就是这么三个函数(是不是觉得并没有什么难度)
3.实现
现在来说说具体的实现方法:
1-记录需要点的位置
2-把鼠标挪到想要点的位置
3-模拟鼠标按下
4-模拟鼠标松开
记录点后依次执行2-4就可以实现鼠标的点击了
无非就是一个while循环,然后到一定次数或者是触发一定条件后就跳出这个循环实现连点结束
4.代码
现在直接上代码(基本都有注释)
1 #include<stdio.h> 2 #include<windows.h> 3 #include<stdlib.h>//头文件 4 #include <conio.h> 5 #include <stdlib.h> 6 #include <stdlib.h> 7 #define max_drop 20 8 #define shift_num 5 9 //清除点 10 void clear_drop(POINT *drop_arr,int drop_num){ 11 for(int i=0;i<drop_num;i++){ 12 drop_arr[i].x=0; 13 drop_arr[i].y=0; 14 } 15 } 16 //设置点 17 void set_drop(POINT *drop_arr,POINT new_drop,int index){ 18 drop_arr[index]=new_drop; 19 } 20 void print_drop(POINT *drop_arr,int drop_num){ 21 printf("(x,y)\n"); 22 for(int i=0;i<drop_num;i++){ 23 printf("(%d,%d)\n",drop_arr[i].x,drop_arr[i].y); 24 } 25 } 26 //打印菜单 27 void print_menu(){ 28 SetConsoleCP(936); 29 printf("----------------------------------------\n"); 30 printf("- F1:在当前鼠标位置添加点 -\n"); 31 printf("- F2:打印点的位置 -\n"); 32 printf("- F3:清空点 -\n"); 33 printf("- F4:设置点击配置 -\n"); 34 printf("- (使用默认配置不用设置) -\n"); 35 printf("- F5:开始点击 -\n"); 36 printf("- F6:暂停点击 -\n"); 37 printf("- F7:暂时未开放 -\n"); 38 printf("- ps:开始点击后请先暂停再进行其他操作 -\n"); 39 printf("----------------------------------------\n"); 40 } 41 //随机数 42 int rand_num(){ 43 int new_num=rand()%shift_num; 44 return new_num; 45 } 46 void SetWinSize(unsigned uCol,unsigned uLine) 47 { 48 char cmd[64]; 49 sprintf_s(cmd,"mode con cols=%d lines=%d",uCol,uLine); 50 system(cmd); 51 } 52 int main(){ 53 int current_drop=0; 54 //点数组 55 POINT drop_arr[max_drop]; 56 system("color a"); 57 SetWinSize(50,20); 58 wchar_t title[]=L"连点器测试版"; 59 SetConsoleTitle(title); 60 //点数量 61 int drop_num=0; 62 //按下时长 63 int drown_time=20; //ms 64 //点击间隔 65 int drown_interval=500; //ms 66 int drop_statu=1; 67 int key_drown_statu=-1; 68 print_menu(); 69 while (1){ 70 int key1 = _getch(); 71 switch (key1){ 72 // 添加点击点 73 case 59: 74 if(drop_num==max_drop){ 75 printf("最多只能设置%d个点\n",max_drop); 76 break; 77 } 78 POINT new_point; 79 GetCursorPos(&new_point); 80 set_drop(drop_arr,new_point,drop_num); 81 drop_num+=1; 82 printf("点设置成功\n"); 83 break; 84 case 60: 85 print_drop(drop_arr,drop_num); 86 break; 87 case 61: 88 clear_drop(drop_arr,drop_num); 89 drop_num=0; 90 printf("点已经全部清空\n"); 91 break; 92 case 62: 93 printf("请输入按下时长(默认10ms):"); 94 scanf_s("%d",&drown_time); 95 printf("请输入点击间隔(默认10ms):"); 96 scanf_s("%d",&drown_interval); 97 printf("配置成功\n"); 98 break; 99 case 63: 100 drop_statu=1; 101 while(drop_statu!=-1){ 102 for(int i=0;i<drop_num;i++){ 103 int x=drop_arr[i].x+rand_num(); 104 int y=drop_arr[i].y+rand_num(); 105 SetCursorPos(x,y); 106 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//当前位置按下鼠标左键 107 Sleep(drown_time); 108 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//当前位置松开鼠标左键 109 Sleep(drown_interval); 110 } 111 if(GetKeyState(VK_F6)){ 112 drop_statu=-1; 113 } 114 } 115 break; 116 case 64: 117 //暂停点击 118 break; 119 case 65: 120 printf("F7键按下\n"); 121 //预留位置 122 break; 123 default: 124 break; 125 } 126 } 127 // POINT point; 128 // GetCursorPos(&point); 129 // printf("x=%d,y=%d\n", point.x, point.y); 130 } 131 132 // _UNICODE 133 // UNICODE
效果图:
5.问题
说一下这个这个过程中遇到的问题
1-在自己电脑上跑能成但是把.exe发送给其他人就跑不了
解决方法:vs2019->项目->属性->c/c++->代码生成,然后将运行库设置成如图
2-问什么人家打开会出现乱码的情况
因为是控制台应用,所以就涉及到代码页了
就比如我的代码页事936,但是编译时用的是65001肯定会乱码了
解决方法:使用GUI
3-暂时没想好