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 键开始监控。
程序会:
- 等待监视区域第一次发生变化(表示用户开始操作)
- 根据设置的"第几次变化开始点击"参数,在相应次数时执行点击
- 检测到变化后,在变化位置延迟指定时间后点击
- 点击完成后自动返回主界面
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))
工作原理
监视流程
- 初始化阶段:用户选择监视区域,设置延迟时间和点击次数
- 等待阶段:程序等待监视区域第一次发生变化
- 计数阶段:根据设置的次数参数,计数变化次数
- 检测阶段:实时检测屏幕变化
- 响应阶段:检测到变化后,延迟指定时间,点击变化位置
- 返回阶段:点击完成后返回主界面
差异检测算法
程序使用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



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