You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:16:05