开始扒拉新的东西——连点器
老规矩,环境要说清楚:我用的是Visual Studio 2022 C++
相较以前,这次是一个较大(稍微一点大)的系列,预计是两期:
【C++连点器一】梦的开始--控制台程序实现基本功能
【C++连点器二】进阶之路--Easy-X程序实现界面美化
今天是第一期
基本功能:
1.基础的连点功能
2.连点按键的选择,目前是三种【鼠标左键,鼠标中键,鼠标右键】
3.点击间隔的设置
设计思路:
头文件:
#include <iostream>//基本操作
#include <Windows.h>//主要会用到按键侦测,模拟鼠标事件,光标控制,标题,窗口设置
#include <conio.h>//也是用于按键侦测六个函数:
1.void SHCursor(BOOL is_HIDE);//控制光标的显示和隐藏
2.void Welcome();//可有可无
3.void Click();//主要的连点功能【对应功能1】
4.void SetInterval();//设置连点间隔【对应功能3】
5.void OutputList();//可选按键列表的显示【服务于KeyChoose】
6.void KeyChoose();//选择按键【搭配OutputList】【对应功能2】
主要的全局变量:
int ClickInterval = 50;//点击间隔
int KeyDownNum = 1;//控制要点击按键,用法:KeyDownValue[KeyDownNum - 1]KeyUpValue[KeyDownNum - 1]
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取实例输出句柄
HWND hwnd = GetForegroundWindow();//获取最前端的窗口
string keych[4] = { ">>","鼠标左键","鼠标中键","鼠标右键" };//服务与OutputList()函数//两个存放鼠标事件的数组
DWORD KeyDownValue[3] = { MOUSEEVENTF_LEFTDOWN ,MOUSEEVENTF_MIDDLEDOWN,MOUSEEVENTF_RIGHTDOWN };
DWORD KeyUpValue[3] = { MOUSEEVENTF_LEFTUP,MOUSEEVENTF_MIDDLEUP,MOUSEEVENTF_RIGHTUP };一个关键宏定义:
//用于按键的侦测(按键是否按下) 返回true或false
#define KEY_DOWN(VK_Key) ((GetAsyncKeyState(VK_Key) & 0x8000) ? 1:0)
函数实现:
1.void SHCursor(BOOL is_HIDE);//控制光标的显示和隐藏
//控制光标隐藏和显示
void SHCursor(BOOL is_HIDE)//这里传入一个布偶参数,控制显示和隐藏
{
CONSOLE_CURSOR_INFO CursorInfo;//光标有关的变量
GetConsoleCursorInfo(hOut, &CursorInfo);//获取光标的信息
CursorInfo.bVisible = is_HIDE;//更改光标的隐藏和显示
SetConsoleCursorInfo(hOut, &CursorInfo);//设置光标的隐藏和显示
}
2.void Welcome();//可有可无
//可有可无的欢迎函数,不予注释
void Welcome()
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
cout << "\n\n\n\t\t";
string welcome[9] = { "欢", "迎", "使", "用\n\t\t", "菜", "鸟", "连", "点", "器" };
for (int i = 0; i < 9; i++)
{
cout << welcome[i];
Sleep(250);
}
cout << endl;
Sleep(250);
}
3.void Click();//主要的连点功能【对应功能1】
//主要连点功能
void Click()
{
SHCursor(FALSE);
system("cls");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);//设置字体颜色
/*SetConsoleTextAttribute()函数和system("color 0a")不同,
这个函数可以进行单独的字体颜色、背景设置
*/
cout << "\t...菜鸟连点器..." << endl;
cout << endl;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "当前点击间隔:" << ClickInterval << "ms" << endl << "当前点击模式:" << keych[KeyDownNum] << endl << endl;
cout << "操作:\n1.按下[Alt]键后启动连点器,松开后关闭\n2.按下[ctrl]键设置连点间隔(间隔默认为50ms/次)\n3.按下[M]键设置连点模式" << endl;
SetConsoleTitle(L"菜鸟连点器[未启动]");
while (1)
{
while (KEY_DOWN(18))
{
SetConsoleTitle(L"菜鸟连点器[已启动]");
Sleep(ClickInterval - 1);
mouse_event(KeyDownValue[KeyDownNum - 1], 0, 0, 0, 0);
mouse_event(KeyUpValue[KeyDownNum - 1], 0, 0, 0, 0);
}
if (KEY_DOWN(17))
{
SetInterval();
}
if (KEY_DOWN(77))
{
KeyChoose();
}
SetConsoleTitle(L"菜鸟连点器[未启动]");
Sleep(1);//不放这个你试试...
}
}
4.void SetInterval();//设置连点间隔【对应功能3】
//没有能注释的地方,都是很常规的操作
void SetInterval()
{
system("cls");
SHCursor(TRUE);
int set;
cout << "设置点击间隔(输入后按下回车键确认)" << endl;
cout << "输入点击间隔(毫秒)(1s = 1000ms):";
cin >> set;
ClickInterval = set;
if (ClickInterval <= 0)
{
MessageBox(hwnd, L"间隔必须大于零", L"ERROR", MB_OK | MB_SETFOREGROUND | MB_ICONERROR | MB_SYSTEMMODAL);
return SetInterval();
}
else
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "\t(:设置完成!!!!!" << endl;
}
Sleep(100);
Click();
}
5.void OutputList();//可选按键列表的显示【服务于KeyChoose】
//按键列表显示
void OutputList()
{
system("cls");
cout << "\t使用按键[1][2][3]选择连点模式" << endl;
cout << "\t使用按键[Enter]确认设置" << endl;
if (KeyDownNum == 1)
{
cout << "\t" << keych[0] << keych[1] << endl;
cout << "\t" << " " << keych[2] << endl;
cout << "\t" << " " << keych[3] << endl;
}
else if (KeyDownNum == 2)
{
cout << "\t" << " " << keych[1] << endl;
cout << "\t" << keych[0] << keych[2] << endl;
cout << "\t" << " " << keych[3] << endl;
}
else if (KeyDownNum == 3)
{
cout << "\t" << " " << keych[1] << endl;
cout << "\t" << " " << keych[2] << endl;
cout << "\t" << keych[0] << keych[3] << endl;
}
}
6.void KeyChoose();//选择按键【搭配OutputList】【对应功能2】
void KeyChoose()
{
int ch = 0;
while (1)
{
OutputList();
ch = _getch();
if (ch == 49)
{
KeyDownNum = 1;//KeyDownNum很重要,关系到KeyDownValue,KeyUpValue的取值,关系到连点的按键
}
else if (ch == 50)
{
KeyDownNum = 2;
}
else if (ch == 51)
{
KeyDownNum = 3;
}
else if (ch == 13)
{
break;
}
else return KeyChoose();
}
Click();
}
所有代码:
#include <iostream>
#include <Windows.h>
#include <conio.h>
#define KEY_DOWN(VK_Key) ((GetAsyncKeyState(VK_Key) & 0x8000) ? 1:0)
using namespace std;
int ClickInterval = 50;
int KeyDownNum = 1;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HWND hwnd = GetForegroundWindow();
string keych[4] = { ">>","鼠标左键","鼠标中键","鼠标右键" };
DWORD KeyDownValue[3] = { MOUSEEVENTF_LEFTDOWN ,MOUSEEVENTF_MIDDLEDOWN,MOUSEEVENTF_RIGHTDOWN };
DWORD KeyUpValue[3] = { MOUSEEVENTF_LEFTUP,MOUSEEVENTF_MIDDLEUP,MOUSEEVENTF_RIGHTUP };
void SHCursor(BOOL is_HIDE);
void Welcome();
void OutputList();
void KeyChoose();
void SetInterval();
void Click();
int main() {
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 400, 250, SWP_NOMOVE);
SetConsoleTitle(L"菜鸟连点器[未启动]");
//窗口风格设置
HWND Con = FindWindow(L"ConsoleWindowClass", NULL);
int GWStyle = (int)GetWindowLong(Con, GWL_STYLE);
SetWindowLong(Con, GWL_STYLE, GWStyle & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
Welcome();
Click();
return 0;
}
void SHCursor(BOOL is_HIDE)
{
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOut, &CursorInfo);
CursorInfo.bVisible = is_HIDE;
SetConsoleCursorInfo(hOut, &CursorInfo);
}
void Welcome()
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
cout << "\n\n\n\t\t";
string welcome[9] = { "欢", "迎", "使", "用\n\t\t", "菜", "鸟", "连", "点", "器" };
for (int i = 0; i < 9; i++)
{
cout << welcome[i];
Sleep(250);
}
cout << endl;
Sleep(250);
}
void Click()
{
SHCursor(FALSE);
system("cls");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << "\t...菜鸟连点器..." << endl;
cout << endl;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "当前点击间隔:" << ClickInterval << "ms" << endl << "当前点击模式:" << keych[KeyDownNum] << endl << endl;
cout << "操作:\n1.按下[Alt]键后启动连点器,松开后关闭\n2.按下[ctrl]键设置连点间隔(间隔默认为50ms/次)\n3.按下[M]键设置连点模式" << endl;
SetConsoleTitle(L"菜鸟连点器[未启动]");
while (1)
{
while (KEY_DOWN(18))
{
SetConsoleTitle(L"菜鸟连点器[已启动]");
Sleep(ClickInterval - 1);
mouse_event(KeyDownValue[KeyDownNum - 1], 0, 0, 0, 0);
mouse_event(KeyUpValue[KeyDownNum - 1], 0, 0, 0, 0);
}
if (KEY_DOWN(17))
{
SetInterval();
}
if (KEY_DOWN(77))
{
KeyChoose();
}
SetConsoleTitle(L"菜鸟连点器[未启动]");
Sleep(1);
}
}
void OutputList()
{
system("cls");
cout << "\t使用按键[1][2][3]选择连点模式" << endl;
cout << "\t使用按键[Enter]确认设置" << endl;
if (KeyDownNum == 1)
{
cout << "\t" << keych[0] << keych[1] << endl;
cout << "\t" << " " << keych[2] << endl;
cout << "\t" << " " << keych[3] << endl;
}
else if (KeyDownNum == 2)
{
cout << "\t" << " " << keych[1] << endl;
cout << "\t" << keych[0] << keych[2] << endl;
cout << "\t" << " " << keych[3] << endl;
}
else if (KeyDownNum == 3)
{
cout << "\t" << " " << keych[1] << endl;
cout << "\t" << " " << keych[2] << endl;
cout << "\t" << keych[0] << keych[3] << endl;
}
}
void KeyChoose()
{
int ch = 0;
while (1)
{
OutputList();
ch = _getch();
if (ch == 49)
{
KeyDownNum = 1;
}
else if (ch == 50)
{
KeyDownNum = 2;
}
else if (ch == 51)
{
KeyDownNum = 3;
}
else if (ch == 13)
{
break;
}
else return KeyChoose();
}
Click();
}
void SetInterval()
{
system("cls");
SHCursor(TRUE);
int set;
cout << "设置点击间隔(输入后按下回车键确认)" << endl;
cout << "输入点击间隔(毫秒)(1s = 1000ms):";
cin >> set;
ClickInterval = set;
if (ClickInterval <= 0)
{
MessageBox(hwnd, L"间隔必须大于零", L"ERROR", MB_OK | MB_SETFOREGROUND | MB_ICONERROR | MB_SYSTEMMODAL);
return SetInterval();
}
else
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "\t(:设置完成!!!!!" << endl;
}
Sleep(100);
Click();
}