依旧连点器
2026-10-03 14:24:18
发布于:上海
/* ============================================================
* 连点器 (Auto Clicker) —— 全局热键版
* 编译环境: Dev-C++ 5.x / TDM-GCC (MinGW) —— 保存为 .cpp
* 系统 : Windows 10
*
* F2 - 开始 / 暂停
* F3 - 切换模式(物理点击 / 后台点击)
* F4 - 锁定鼠标所指窗口(后台点击用)
* F5 - 间隔 -10ms
* F6 - 间隔 +10ms
* ESC - 退出程序 ★任何窗口下都有效★
* ============================================================ */
#include <windows.h>
#include <stdio.h>
/* ---------------- 全局状态 ---------------- */
int g_interval = 50; // 点击间隔(ms)
bool g_running = false; // 连点开关
int g_mode = 1; // 1 = 物理点击, 2 = 后台点击
HWND g_target = NULL; // 后台点击目标窗口
POINT g_clientPt = {0, 0}; // 目标窗口客户区中的点击坐标
/* ---------------- 按键标志(钩子写入, 主循环消费) ---------------- */
volatile bool g_escHit = false;
volatile bool g_f2Hit = false;
volatile bool g_f3Hit = false;
volatile bool g_f4Hit = false;
volatile bool g_f5Hit = false;
volatile bool g_f6Hit = false;
HHOOK g_hook = NULL;
/* ============================================================
* 低级键盘钩子回调
* - 无论窗口是否前置都能收到按键
* - 用 CallNextHookEx 把按键继续传给其它程序,不干扰正常使用
* ============================================================ */
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
{
switch (p->vkCode)
{
case VK_ESCAPE: g_escHit = true; break;
case VK_F2: g_f2Hit = true; break;
case VK_F3: g_f3Hit = true; break;
case VK_F4: g_f4Hit = true; break;
case VK_F5: g_f5Hit = true; break;
case VK_F6: g_f6Hit = true; break;
}
}
}
return CallNextHookEx(g_hook, nCode, wParam, lParam);
}
/* ---------------- 执行一次点击 ---------------- */
void DoClick()
{
if (g_mode == 1)
{
/* 【物理点击】模拟真实鼠标左键按下/抬起,点当前指针位置 */
INPUT in[2];
ZeroMemory(in, sizeof(in));
in[0].type = INPUT_MOUSE;
in[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
in[1].type = INPUT_MOUSE;
in[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(2, in, sizeof(INPUT));
}
else
{
/* 【后台点击】直接向目标窗口投递鼠标消息,窗口被遮挡也能点到 */
if (g_target == NULL || !IsWindow(g_target)) return;
LPARAM lp = MAKELPARAM(g_clientPt.x, g_clientPt.y);
PostMessage(g_target, WM_LBUTTONDOWN, MK_LBUTTON, lp);
PostMessage(g_target, WM_LBUTTONUP, 0, lp);
}
}
/* ---------------- 主函数 ---------------- */
int main()
{
SetConsoleTitleA("连点器 [ESC 退出]");
/* 若 Dev-C++ 以 UTF-8 保存导致中文乱码,
请把源文件另存为 ANSI/GBK,或去掉下面这行注释 */
/* SetConsoleOutputCP(936); */
printf("==================================================\n");
printf(" 连 点 器\n");
printf("==================================================\n");
printf(" F2 : 开始 / 暂停\n");
printf(" F3 : 切换模式 (物理点击 <-> 后台点击)\n");
printf(" F4 : 锁定鼠标所指的窗口 (后台点击用)\n");
printf(" F5 : 间隔 -10ms\n");
printf(" F6 : 间隔 +10ms\n");
printf(" ESC : 退出程序 (任何窗口下都有效)\n");
printf("--------------------------------------------------\n");
printf(" 【物理点击】鼠标移到哪就点哪,目标窗口需可见。\n");
printf(" 【后台点击】把鼠标移到目标窗口上要点击的位置,\n");
printf(" 按 F4 锁定,之后该窗口即使被遮挡、\n");
printf(" 不在前台,也能被点到。\n");
printf("==================================================\n\n");
/* ---------- 安装全局键盘钩子 ---------- */
g_hook = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc,
GetModuleHandle(NULL),
0);
if (g_hook == NULL)
{
printf("[警告] 全局键盘钩子安装失败(错误码 %lu)。\n", GetLastError());
printf(" ESC 可能只在窗口有焦点时才能退出。\n\n");
}
else
{
printf("[OK] 全局热键已启用,切到任意窗口下按 ESC 均可退出。\n\n");
}
DWORD lastTick = GetTickCount();
while (true)
{
/* ---- 处理消息,让键盘钩子回调能被调用 ---- */
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* ---- ESC 退出(最高优先级) ---- */
if (g_escHit)
{
g_escHit = false;
break;
}
/* ---- F2 开始/暂停 ---- */
if (g_f2Hit)
{
g_f2Hit = false;
g_running = !g_running;
printf("%s\n", g_running ? ">>> 开始连点" : ">>> 已暂停");
}
/* ---- F3 切换模式 ---- */
if (g_f3Hit)
{
g_f3Hit = false;
g_mode = (g_mode == 1) ? 2 : 1;
printf(">>> 切换为【%s】模式\n",
g_mode == 1 ? "物理点击" : "后台点击");
}
/* ---- F4 锁定鼠标所指窗口 ---- */
if (g_f4Hit)
{
g_f4Hit = false;
POINT pt;
GetCursorPos(&pt);
HWND h = WindowFromPoint(pt);
if (h != NULL && h != GetConsoleWindow())
{
g_target = h;
POINT cp = pt;
ScreenToClient(g_target, &cp);
g_clientPt = cp;
char title[256] = {0};
GetWindowTextA(g_target, title, 255);
printf(">>> 已锁定窗口: \"%s\" 点击位置(%d, %d)\n",
title, g_clientPt.x, g_clientPt.y);
printf(" (窗口移动或改变大小后需重新锁定)\n");
}
else
{
printf(">>> 锁定失败: 请把鼠标移到目标窗口上再按 F4\n");
}
}
/* ---- F5 / F6 调整间隔 ---- */
if (g_f5Hit)
{
g_f5Hit = false;
g_interval -= 10;
if (g_interval < 10) g_interval = 10;
printf(">>> 间隔 = %d ms\n", g_interval);
}
if (g_f6Hit)
{
g_f6Hit = false;
g_interval += 10;
if (g_interval > 5000) g_interval = 5000;
printf(">>> 间隔 = %d ms\n", g_interval);
}
/* ---- 连点主逻辑 ---- */
if (g_running)
{
DWORD now = GetTickCount();
if (now - lastTick >= (DWORD)g_interval)
{
lastTick = now;
DoClick();
}
}
else
{
lastTick = GetTickCount(); // 暂停时重置计时,恢复后不爆发
}
Sleep(1);
}
/* ---------- 收尾 ---------- */
if (g_hook) UnhookWindowsHookEx(g_hook);
printf("\n>>> 程序已退出,再见!\n");
system("pause");
return 0;
}
这里空空如也




















有帮助,赞一个