C语言像素监测点击程序故障求助:无响应且随机闪退
问题修复:像素监测与自动点击程序
修复后的完整代码
#include <windows.h> #include <iostream> using namespace std; int main() { // 提前获取桌面窗口和设备上下文,避免循环内重复创建 HWND desktopWnd = GetDesktopWindow(); HDC desktopDC = GetDC(desktopWnd); if (!desktopDC) { cout << "获取设备上下文失败!" << endl; return 1; } // 获取正确的屏幕分辨率 int screenWidth = GetDeviceCaps(desktopDC, HORZRES); int screenHeight = GetDeviceCaps(desktopDC, VERTRES); const int targetX = 1500; const int targetY = 100; // 检查目标坐标是否在屏幕范围内 if (targetX >= screenWidth || targetY >= screenHeight) { cout << "目标坐标超出屏幕范围!" << endl; ReleaseDC(desktopWnd, desktopDC); return 1; } for (int i = 0; i < 200; ++i) { cout << "第 " << i+1 << " 轮监测开始..." << endl; // 获取初始像素值 DWORD initialColor = GetPixel(desktopDC, targetX, targetY); if (initialColor == CLR_INVALID) { cout << "获取初始像素失败!" << endl; break; } // 等待像素变化,添加延迟避免CPU占用过高 while (GetPixel(desktopDC, targetX, targetY) == initialColor) { Sleep(100); } cout << "检测到像素变化,开始执行点击..." << endl; Sleep(5000); // 等待5秒 // 第一次点击:移动到目标坐标+左键点击 INPUT mouseInputs1[] = { { INPUT_MOUSE, { (LONG)(targetX * 65535.0 / screenWidth), (LONG)(targetY * 65535.0 / screenHeight), 0, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, 0, 0 } }, { INPUT_MOUSE, {0, 0, 0, MOUSEEVENTF_LEFTDOWN, 0, 0} }, { INPUT_MOUSE, {0, 0, 0, MOUSEEVENTF_LEFTUP, 0, 0} } }; SendInput(_countof(mouseInputs1), mouseInputs1, sizeof(INPUT)); Sleep(1000); // 等待1秒 // 第二次左键点击 INPUT mouseInputs2[] = { { INPUT_MOUSE, {0, 0, 0, MOUSEEVENTF_LEFTDOWN, 0, 0} }, { INPUT_MOUSE, {0, 0, 0, MOUSEEVENTF_LEFTUP, 0, 0} } }; SendInput(_countof(mouseInputs2), mouseInputs2, sizeof(INPUT)); Sleep(3000); // 等待3秒 } // 释放资源 ReleaseDC(desktopWnd, desktopDC); cout << "程序执行完毕!" << endl; return 0; }
关键修复点说明
- 清理无用头文件:删除
stdio.h、conio.h、stdlib.h、unistd.h,其中unistd.h是Linux/Unix专属头文件,Windows环境下引入会导致编译错误。 - 修正屏幕分辨率获取:
GetDeviceCaps的参数改为HORZRES(水平分辨率)和VERTRES(垂直分辨率),原代码中的590、880是错误常量,会导致坐标计算完全失效。 - 修复睡眠函数:Windows下使用
Sleep()(首字母大写),参数为毫秒数,原代码的sleep(0.10)会被截断为0,且sleep是Linux函数,改为Sleep(100)实现100毫秒延迟。 - 规范INPUT结构体初始化:
INPUT是联合体,必须明确指定type为INPUT_MOUSE,并正确初始化mi(鼠标输入)成员字段,原代码的直接赋值方式不符合结构体规范。 - 修复SendInput参数错误:第二次调用
SendInput时,原代码错误传入了m数组,改为传入正确的mouseInputs2数组。 - 移除阻塞式输入:删除循环内的
getch(),原代码会因等待按键导致无法自动执行循环。 - 增加错误检查:添加了设备上下文获取失败、目标坐标越界、像素获取失败的检查,便于排查运行问题。
- 优化资源管理:将桌面窗口和设备上下文的获取放在循环外,避免重复创建释放,提升程序效率。
内容的提问来源于stack exchange,提问作者sarpsl
相关产品推荐
相关产品推荐

