#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
// 定义操作枚举
enum GameAction {
ACTION_NONE,
ACTION_TAKE_PILL, // 服丹
ACTION_MEDITATE, // 打坐
ACTION_TRAIN, // 历练
ACTION_STOP // 停止当前操作
};
// 模拟鼠标点击函数(增强版)
void SimulateClick(int x, int y) {
POINT originalPos;
GetCursorPos(&originalPos); // 保存原始鼠标位置
SetCursorPos(x, y); // 移动鼠标到目标位置
// 完整鼠标点击事件序列(按下->释放)
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(50 + rand() % 100); // 随机点击间隔,防止检测
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetCursorPos(originalPos.x, originalPos.y); // 恢复原始位置
}
// 全局状态变量
int meditationMonths = 0; // 打坐累计月份
GameAction currentAction = ACTION_NONE;
// 获取窗口句柄
HWND FindGameWindow(const char* windowTitle) {
return FindWindowA(NULL, windowTitle);
}
// 获取窗口位置并固定
void PositionAndFixWindow(HWND hwnd, int x, int y) {
if (hwnd) {
// 设置窗口位置并固定在最前
SetWindowPos(hwnd, HWND_TOPMOST, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
printf("窗口已固定到位置: (%d, %d)\n", x, y);
}
}
int main() {
// 提示用户设置游戏窗口标题
char windowTitle[256];
printf("请输入游戏窗口标题: ");
fgets(windowTitle, sizeof(windowTitle), stdin);
windowTitle[strcspn(windowTitle, "\n")] = '\0'; // 移除换行符
// 查找游戏窗口
HWND gameWindow = FindGameWindow(windowTitle);
if (!gameWindow) {
printf("未找到标题为 '%s' 的窗口\n", windowTitle);
return 1;
}
// 获取窗口位置
RECT windowRect;
GetWindowRect(gameWindow, &windowRect);
// 固定窗口位置(使用当前位置)
PositionAndFixWindow(gameWindow, windowRect.left, windowRect.top);
// 定义操作位置的相对坐标(相对于窗口)
POINT pillRelative = {100, 150}; // 服丹按钮
POINT meditateRelative = {100, 200}; // 打坐按钮
POINT trainRelative = {100, 250}; // 历练按钮
POINT stopRelative = {200, 200}; // 停止按钮
// 转换为绝对坐标
POINT pillPosition = {pillRelative.x + windowRect.left, pillRelative.y + windowRect.top};
POINT meditatePosition = {meditateRelative.x + windowRect.left, meditateRelative.y + windowRect.top};
POINT trainPosition = {trainRelative.x + windowRect.left, trainRelative.y + windowRect.top};
POINT stopPosition = {stopRelative.x + windowRect.left, stopRelative.y + windowRect.top};
printf("游戏操作自动化程序(鼠标控制)\n");
printf("窗口位置: X=%d, Y=%d, 宽度=%d, 高度=%d\n",
windowRect.left, windowRect.top,
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top);
printf("操作按钮位置:\n");
printf(" 服丹: (%d, %d)\n", pillPosition.x, pillPosition.y);
printf(" 打坐: (%d, %d)\n", meditatePosition.x, meditatePosition.y);
printf(" 历练: (%d, %d)\n", trainPosition.x, trainPosition.y);
printf(" 停止: (%d, %d)\n", stopPosition.x, stopPosition.y);
printf("\n操作说明:\n");
printf(" - 点击服丹按钮: 执行服丹操作\n");
printf(" - 点击打坐按钮: 开始打坐(每秒钟增加1个月)\n");
printf(" - 点击停止按钮: 结束当前操作\n");
printf(" - 点击历练按钮: 执行历练操作\n");
printf(" - 按ESC键: 退出程序\n");
// 主循环
while (1) {
POINT cursorPos;
GetCursorPos(&cursorPos); // 获取当前鼠标位置
// 检测鼠标左键点击
if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) {
// 检测点击位置并执行相应操作
if (cursorPos.x > pillPosition.x - 20 && cursorPos.x < pillPosition.x + 20 &&
cursorPos.y > pillPosition.y - 20 && cursorPos.y < pillPosition.y + 20) {
SimulateClick(pillPosition.x, pillPosition.y);
currentAction = ACTION_TAKE_PILL;
printf("[操作] 服丹成功!\n");
}
else if (cursorPos.x > meditatePosition.x - 20 && cursorPos.x < meditatePosition.x + 20 &&
cursorPos.y > meditatePosition.y - 20 && cursorPos.y < meditatePosition.y + 20) {
SimulateClick(meditatePosition.x, meditatePosition.y);
currentAction = ACTION_MEDITATE;
meditationMonths = 0; // 重置打坐时间
printf("[操作] 开始打坐...\n");
}
else if (cursorPos.x > trainPosition.x - 20 && cursorPos.x < trainPosition.x + 20 &&
cursorPos.y > trainPosition.y - 20 && cursorPos.y < trainPosition.y + 20) {
SimulateClick(trainPosition.x, trainPosition.y);
currentAction = ACTION_TRAIN;
printf("[操作] 开始历练...\n");
}
else if (cursorPos.x > stopPosition.x - 20 && cursorPos.x < stopPosition.x + 20 &&
cursorPos.y > stopPosition.y - 20 && cursorPos.y < stopPosition.y + 20) {
SimulateClick(stopPosition.x, stopPosition.y);
printf("[操作] 停止 %s\n",
currentAction == ACTION_MEDITATE ? "打坐" :
currentAction == ACTION_TRAIN ? "历练" : "操作");
currentAction = ACTION_NONE;
}
Sleep(300); // 防止重复检测
}
// 处理当前操作状态
switch (currentAction) {
case ACTION_MEDITATE:
meditationMonths++;
printf("[打坐] 已修炼 %d 个月\n", meditationMonths);
break;
case ACTION_TRAIN:
printf("[历练] 历练中...\n");
break;
case ACTION_TAKE_PILL:
printf("[服丹] 丹药生效中...\n");
currentAction = ACTION_NONE; // 单次操作
break;
}
// 检测ESC键退出
if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
printf("程序已退出\n");
break;
}
// 降低CPU占用率
Sleep(1000); // 1秒刷新一次
}
return 0;
}
//该代码左键点击会显示白色,点击不了,增加一个左键点击的代码