Python屏幕监视器 - 自动检测屏幕变化并点击

Python屏幕监视器 - 自动检测屏幕变化并点击

项目简介

本项目是一个基于Python开发的屏幕监视器工具,能够实时监控屏幕指定区域的变化,并在检测到变化后自动点击变化位置。该工具适用于需要自动化点击的场景,如游戏辅助、自动化测试等。

功能特点

  • 区域选择:自由选择屏幕上的监视区域,支持拖动和调整大小
  • 变化检测:实时检测屏幕区域的变化
  • 自动点击:检测到变化后自动点击变化位置
  • 延迟设置:可设置发现变化后的延迟点击时间
  • 次数控制:可设置第几次变化才开始点击
  • 快捷键支持:F1打开监视区域,F2开始监控
  • 图形界面:基于PySide6的现代化GUI界面

技术栈

  • PySide6:Qt框架的Python绑定,用于构建图形界面
  • mss:高性能屏幕截图库
  • numpy:用于图像处理和差异检测
  • pynput:鼠标控制库
  • ctypes:Windows API调用,用于更精确的鼠标控制

环境搭建

1. 安装Python

确保已安装Python 3.8或更高版本。

2. 安装依赖库

创建虚拟环境(推荐):

bash 复制代码
python -m venv venv
venv\Scripts\activate

安装项目依赖:

bash 复制代码
pip install -r requirements.txt

或手动安装:

bash 复制代码
pip install mss==10.1.0
pip install numpy==2.4.1
pip install pynput==1.8.1
pip install PySide6==6.10.1

项目结构

复制代码
屏幕监视器/
├── mian.py                 # 程序入口
├── main_window.py          # 主窗口逻辑
├── main_window.ui          # UI界面文件
├── monitor/                # 监视模块
│   ├── __init__.py
│   └── monitor.py          # 屏幕监视核心逻辑
├── screenSelection/        # 区域选择模块
│   ├── __init__.py
│   └── screenSelection.py  # 区域选择窗口
├── monitor.png             # 程序图标
├── monitor.ico             # Windows图标
├── requirements.txt        # 依赖列表
└── ScreenMonitor.spec      # PyInstaller打包配置

使用说明

1. 启动程序

运行主程序:

bash 复制代码
python mian.py

说明:显示程序主界面,包含延迟时间设置、次数设置、截屏确定区域按钮和关于按钮

2. 设置参数

在主界面可以设置以下参数:

  • 延迟时间:发现变化后多少秒进行点击(单位:秒),可能比设置的慢 20ms ~ 40ms 之间
  • 第几次变化开始点击:设置第几次检测到变化时才执行点击操作,比如一下是 第 2 次变化,我点击F2后开始对透明黑区域进行监测,我点击开始从" 蓝 " -> " 红 " 为第 1 次,不会点击屏幕,但是 从" 红 " -> " 绿 " 为第二次就出现了点击,代码延迟大概30ms ~ 50 ms之间

3. 选择监视区域

有两种方式打开监视区域窗口:

  • 点击「截屏确定区域」按钮
  • 按下 F1 快捷键

打开监视区域窗口后:

  • 拖动窗口到想要监控的位置
  • 拖动窗口边缘调整监视区域大小
  • 右键点击监视区域可关闭窗口

4. 开始监控

在监视区域窗口中,按下 F2 键开始监控。

程序会:

  1. 等待监视区域第一次发生变化(表示用户开始操作)
  2. 根据设置的"第几次变化开始点击"参数,在相应次数时执行点击
  3. 检测到变化后,在变化位置延迟指定时间后点击
  4. 点击完成后自动返回主界面

5. 快捷键说明

快捷键 功能
F1 打开/显示监视区域
F2 开始监控
右键 关闭监视区域

核心代码解析

1. 主窗口 (main_window.py)

主窗口负责程序的UI展示和用户交互:

python 复制代码
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.load_ui()           # 加载UI文件
        self.setWindowTitle("主窗口")
        self.connect_signals()   # 连接信号槽
        self.rect = None
        self.setup_shortcuts()   # 设置快捷键

2. 屏幕监视核心 (monitor/monitor.py)

监视模块使用mss进行屏幕截图,numpy进行图像差异检测:

python 复制代码
def diff_Monitor(self, img_start, start_time, parent):
    with mss.mss() as sct:
        while True:
            screenshot = sct.grab(self.monitor_region)
            img1 = np.array(screenshot)
            img1 = img1[:, :, :3]
            
            diff = img1 != img_start
            if diff.any():
                changed_indices = np.where(diff)
                y = changed_indices[0][0]
                x = changed_indices[1][0]
                screen_x = self.monitor_region["left"] + x
                screen_y = self.monitor_region["top"] + y
                time.sleep(self.delay)
                self.click_at(screen_x, screen_y, parent)
                break

3. 鼠标控制

使用ctypes调用Windows API进行精确的鼠标控制:

python 复制代码
def click_at(self, x, y, parent):
    screen_width = ctypes.windll.user32.GetSystemMetrics(0)
    screen_height = ctypes.windll.user32.GetSystemMetrics(1)
    
    abs_x = int(x * 65535 / screen_width)
    abs_y = int(y * 65535 / screen_height)
    
    # 使用SendInput进行鼠标点击
    inp = INPUT()
    inp.type = 0
    inp.mi = MOUSEINPUT(abs_x, abs_y, 0, 0x0001 | 0x8000, 0, 0)
    ctypes.windll.user32.SendInput(1, ctypes.byref(inp), ctypes.sizeof(INPUT))

工作原理

监视流程

  1. 初始化阶段:用户选择监视区域,设置延迟时间和点击次数
  2. 等待阶段:程序等待监视区域第一次发生变化
  3. 计数阶段:根据设置的次数参数,计数变化次数
  4. 检测阶段:实时检测屏幕变化
  5. 响应阶段:检测到变化后,延迟指定时间,点击变化位置
  6. 返回阶段:点击完成后返回主界面

差异检测算法

程序使用numpy进行像素级差异检测:

  • 截取监视区域当前帧
  • 与上一帧进行像素对比
  • 找到第一个变化的像素位置
  • 计算该像素在屏幕上的绝对坐标
  • 在该位置执行点击操作

常见问题

1. 延迟时间不准确

延迟时间为理论值,实际响应时间可能会稍长一些,这是由于:

  • 屏幕截图和图像处理需要时间
  • 系统调度和鼠标操作有延迟

2. 监视区域无法显示

确保:

  • 已正确安装PySide6
  • main_window.ui文件存在于程序目录
  • 程序有足够的权限

3. 点击位置不准确

可能原因:

  • 屏幕缩放设置影响
  • 多显示器环境下的坐标计算
  • 解决方法:调整屏幕缩放为100%

应用场景

  • 游戏辅助:自动检测游戏画面变化并点击
  • 自动化测试:监控界面变化并触发操作
  • 监控告警:检测屏幕特定区域的变化
  • 办公自动化:自动响应界面变化

说明:展示程序在不同场景下的应用示例

总结

本屏幕监视器工具通过结合PySide6、mss、numpy等技术,实现了高效的屏幕变化检测和自动点击功能。程序具有界面友好、操作简单、响应迅速等特点,适用于多种自动化场景。

源码获取

完整源码已上传至GitHub,欢迎Star和Fork!

bash 复制代码
github地址:https://github.com/mojoin/ScreenChangeShockDevice

gitee地址:https://gitee.com/lclIzzxw/ScreenChangeShockDevice

软件直接下载

bash 复制代码
蓝奏云下载:https://wwaoc.lanzn.com/iftjI3h8cbzc
密码:3k3z

github下载:https://github.com/mojoin/ScreenChangeShockDevice/releases/tag/v1.0.0

gitee下载:https://gitee.com/lclIzzxw/ScreenChangeShockDevice/releases/tag/v1.0.0

相关推荐


注意:本工具仅供学习和研究使用,请勿用于违反游戏规则或其他不当用途。

相关推荐
天天睡大觉2 小时前
Python学习12
网络·python·学习
小龙报2 小时前
【C语言进阶数据结构与算法】单链表综合练习:1.删除链表中等于给定值 val 的所有节点 2.反转链表 3.链表中间节点
c语言·开发语言·数据结构·c++·算法·链表·visual studio
黎雁·泠崖2 小时前
Java抽象类与接口:定义+区别+实战应用
java·开发语言
cfqq19892 小时前
Settings,变量保存
开发语言·c#
女王大人万岁2 小时前
Go标准库 io与os库详解
服务器·开发语言·后端·golang
程序员杰哥2 小时前
性能测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
露天赏雪2 小时前
Java 高并发编程实战:从线程池到分布式锁,解决生产环境并发问题
java·开发语言·spring boot·分布式·后端·mysql
CoderCodingNo2 小时前
【GESP】C++五级练习题 luogu-P3353 在你窗外闪耀的星星
开发语言·c++·算法
NMIXX爻3 小时前
线程控制 下
java·开发语言·jvm