当前位置: 首页 > news >正文

使用 PowerShell 自动化图像识别与鼠标操作

目录

  • 前言
  • 功能概述
  • 代码实现
    • 1. 引入必要的程序集
    • 2. 定义读取文件行的函数
    • 3. 定义加载图片的函数
    • 4. 定义查找小图像在大图像中的位置的函数
    • 5. 定义截取全屏的函数
    • 6. 定义模拟鼠标点击的函数
    • 7. 定义主函数
  • 配置文件示例
  • 运行脚本
  • 结语
  • 全部代码
  • 提示
    • 打包exe
  • 下载地址

前言

在日常工作中,我们有时需要进行一些自动化操作,比如在屏幕上找到特定图像并执行鼠标点击操作。本文将介绍如何使用 PowerShell 实现这一功能。

功能概述

本文提供的脚本包括以下功能:

读取配置文件,获取需要操作的图像路径、鼠标按键类型以及延迟时间。
截取屏幕并寻找特定图像的位置。
在找到图像后模拟鼠标点击。
根据配置文件中的延迟时间,执行下一次操作。

代码实现

1. 引入必要的程序集

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

2. 定义读取文件行的函数

function Read-FileLines {param ([string]$filePath)return Get-Content -Path $filePath
}

3. 定义加载图片的函数

function Load-Image {param ([string]$imagePath)return [System.Drawing.Image]::FromFile($imagePath)
}

4. 定义查找小图像在大图像中的位置的函数

function Find-ImagePosition {param ([System.Drawing.Bitmap]$bigImage,[System.Drawing.Bitmap]$smallImage)# 查找逻辑...return $null
}

5. 定义截取全屏的函数

function Capture-Screen {$screenWidth = [System.Windows.Forms.SystemInformation]::VirtualScreen.Width$screenHeight = [System.Windows.Forms.SystemInformation]::VirtualScreen.Height$bitmap = New-Object System.Drawing.Bitmap($screenWidth, $screenHeight)$graphics = [System.Drawing.Graphics]::FromImage($bitmap)$graphics.CopyFromScreen(0, 0, 0, 0, [System.Drawing.Size]::new($screenWidth, $screenHeight))$graphics.Dispose()return $bitmap
}

6. 定义模拟鼠标点击的函数

Add-Type @"
using System;
using System.Runtime.InteropServices;public class User32 {[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);public const int MOUSEEVENTF_MOVE = 0x0001;public const int MOUSEEVENTF_LEFTDOWN = 0x0002;public const int MOUSEEVENTF_LEFTUP = 0x0004;public const int MOUSEEVENTF_RIGHTDOWN = 0x0008;public const int MOUSEEVENTF_RIGHTUP = 0x0010;public const int MOUSEEVENTF_ABSOLUTE = 0x8000;
}
"@
function Simulate-Click {param ([int]$x,[int]$y,[int]$button)[System.Windows.Forms.Cursor]::Position = [System.Drawing.Point]::new($x, $y)switch ($button) {1 { [User32]::mouse_event([User32]::MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)[User32]::mouse_event([User32]::MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)}2 {[User32]::mouse_event([User32]::MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)[User32]::mouse_event([User32]::MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)}}
}

7. 定义主函数

function Run {param ([string]$configPath)$configLines = Read-FileLines -filePath $configPathwhile(1){foreach ($line in $configLines) {$parts = $line -split ' '$imagePath = $parts[0]$button = [int]$parts[1]$delay = [int]$parts[2]$smallImage = Load-Image -imagePath $imagePathwhile(1){$bigImage = Capture-Screen$position = Find-ImagePosition -bigImage $bigImage -smallImage $smallImageif ($position -ne $null) {Write-Output "Click Position $position"Simulate-Click -x $position.X -y $position.Y -button $buttonbreak} else {Write-Output "Not Find $imagePath"Start-Sleep -Milliseconds 500}}Start-Sleep -Seconds $delayWrite-Output "Time-Sleep $delay"}}
}
Run -configPath "./conf.dd"

配置文件示例

image1.png 1 5
image2.png 2 3

配置文件中,每一行代表一组操作,依次为图像路径、鼠标按键(1为左键,2为右键)和延迟时间(秒)。

运行脚本

# 如果遇到执行权限问题,请运行以下命令解除限制
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process# 执行脚本
Run -configPath "./conf.dd"

结语

通过以上脚本,我们可以实现自动化图像识别与鼠标点击操作,大大提高了工作效率。希望本文对您有所帮助。如果您有任何问题或建议,欢迎留言讨论。

全部代码

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing# 读取指定位置的文件,返回按行分割的string列表
function Read-FileLines {param ([string]$filePath)return Get-Content -Path $filePath
}# 读取指定位置的图片,返回图片的指针
function Load-Image {param ([string]$imagePath)return [System.Drawing.Image]::FromFile($imagePath)
}# 查找小图片在大图片中的位置,返回小图片在大图片中的位置(中心点)
function Find-ImagePosition {param ([System.Drawing.Bitmap]$bigImage,[System.Drawing.Bitmap]$smallImage)$bigData = $bigImage.LockBits([System.Drawing.Rectangle]::FromLTRB(0, 0, $bigImage.Width, $bigImage.Height), [System.Drawing.Imaging.ImageLockMode]::ReadOnly, $bigImage.PixelFormat)$smallData = $smallImage.LockBits([System.Drawing.Rectangle]::FromLTRB(0, 0, $smallImage.Width, $smallImage.Height), [System.Drawing.Imaging.ImageLockMode]::ReadOnly, $smallImage.PixelFormat)try {for ($x = 0; $x -le $bigData.Width - $smallData.Width; $x++) {for ($y = 0; $y -le $bigData.Height - $smallData.Height; $y++) {$found = $truefor ($i = 0; $i -lt $smallData.Width; $i++) {for ($j = 0; $j -lt $smallData.Height; $j++) {$bigColor = [System.Drawing.Color]::FromArgb([System.Runtime.InteropServices.Marshal]::ReadInt32($bigData.Scan0, (($y + $j) * $bigData.Stride) + ($x + $i) * 4))$smallColor = [System.Drawing.Color]::FromArgb([System.Runtime.InteropServices.Marshal]::ReadInt32($smallData.Scan0, ($j * $smallData.Stride) + $i * 4))if ($bigColor.ToArgb() -ne $smallColor.ToArgb()) {$found = $falsebreak}}if (-not $found) { break }}if ($found) {return [System.Drawing.Point]::new($x + [math]::Round($smallData.Width / 2), $y + [math]::Round($smallData.Height / 2))}}}} finally {$bigImage.UnlockBits($bigData)$smallImage.UnlockBits($smallData)}return $null
}# 截取全屏,返回指针
function Capture-Screen {$screenWidth = [System.Windows.Forms.SystemInformation]::VirtualScreen.Width$screenHeight = [System.Windows.Forms.SystemInformation]::VirtualScreen.Height$bitmap = New-Object System.Drawing.Bitmap($screenWidth, $screenHeight)$graphics = [System.Drawing.Graphics]::FromImage($bitmap)$graphics.CopyFromScreen(0, 0, 0, 0, [System.Drawing.Size]::new($screenWidth, $screenHeight))$graphics.Dispose()return $bitmap
}# 模拟鼠标点击移动,传入x,y
Add-Type @"
using System;
using System.Runtime.InteropServices;public class User32 {[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);public const int MOUSEEVENTF_MOVE = 0x0001;public const int MOUSEEVENTF_LEFTDOWN = 0x0002;public const int MOUSEEVENTF_LEFTUP = 0x0004;public const int MOUSEEVENTF_RIGHTDOWN = 0x0008;public const int MOUSEEVENTF_RIGHTUP = 0x0010;public const int MOUSEEVENTF_ABSOLUTE = 0x8000;
}
"@function Simulate-Click {param ([int]$x,[int]$y,[int]$button)[System.Windows.Forms.Cursor]::Position = [System.Drawing.Point]::new($x, $y)switch ($button) {1 { # 左键[User32]::mouse_event([User32]::MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)[User32]::mouse_event([User32]::MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)}2 { # 右键[User32]::mouse_event([User32]::MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)[User32]::mouse_event([User32]::MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)}}
}# 主函数
function Run {param ([string]$configPath)$configLines = Read-FileLines -filePath $configPathwhile(1){foreach ($line in $configLines) {$parts = $line -split ' '$imagePath = $parts[0]$button = [int]$parts[1]$delay = [int]$parts[2]$smallImage = Load-Image -imagePath $imagePathwhile(1){$bigImage = Capture-Screen$position = Find-ImagePosition -bigImage $bigImage -smallImage $smallImageif ($position -ne $null) {Write-Output "Click Position $position"Simulate-Click -x $position.X -y $position.Y -button $buttonbreak} else {Write-Output "Not Find $imagePath"Start-Sleep -Milliseconds 500}}Start-Sleep -Seconds $delayWrite-Output "Time-Sleep $delay"}}}Run -configPath ”./conf.dd“
# Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
# 示例使用

提示

打包exe

Install-Module -Name ps2exe -Scope CurrentUser
Invoke-ps2exe -InputFile .\run.ps1 -OutputFile .\run.exe

下载地址

传送门

相关文章:

使用 PowerShell 自动化图像识别与鼠标操作

目录 前言功能概述代码实现1. 引入必要的程序集2. 定义读取文件行的函数3. 定义加载图片的函数4. 定义查找小图像在大图像中的位置的函数5. 定义截取全屏的函数6. 定义模拟鼠标点击的函数7. 定义主函数 配置文件示例运行脚本结语全部代码提示打包exe 下载地址 前言 在日常工作…...

组队学习——支持向量机

本次学习支持向量机部分数据如下所示 IDmasswidthheightcolor_scorefruit_namekind 其中ID:1-59是对应训练集和验证集的数据,60-67是对应测试集的数据,其中水果类别一共有四类包括apple、lemon、orange、mandarin。要求根据1-59的数据集的自…...

【数据中心】数据中心的IP封堵防护:构建网络防火墙的基石

数据中心的IP封堵防护:构建网络防火墙的基石 引言一、理解IP封堵二、IP封堵的功能模块及其核心技术三、实施IP封堵的关键策略四、结论 引言 在当今高度互联的世界里,数据中心成为信息流动和存储的神经中枢,承载着企业和组织的大量关键业务。…...

LangChain的使用详解

一、 概念介绍 1.1 Langchain 是什么? 官方定义是:LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序,它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供…...

Modbus转BACnet/IP网关快速对接Modbus协议设备与BA系统

摘要 在智能建筑和工业自动化领域,Modbus和BACnet/IP协议的集成应用越来越普遍。BA(Building Automation,楼宇自动化)系统作为现代建筑的核心,需要高效地处理来自不同协议的设备数据,负责监控和管理建筑内…...

万字长文之分库分表里无分库分表键如何查询【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表 | 其他查询】

在很多业务里,分库分表键都是根据主要查询筛选出来的,那么不怎么重要的查询怎么解决呢? 比如电商场景下,订单都是按照买家ID来分库分表的,那么商家该怎么查找订单呢?或是买家找客服,客服要找到对…...

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…...

科研绘图系列:R语言TCGA分组饼图(multiple pie charts)

介绍 在诸如癌症基因组图谱(TCGA)等群体研究项目中,为了有效地表征和比较不同群体的属性分布,科研人员广泛采用饼图作为数据可视化的工具。饼图通过将一个完整的圆形划分为若干个扇形区域,每个扇形区域的面积大小直接对应其代表的属性在整体中的占比。这种图形化的展示方…...

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型(LLMs)在处理长文本时受限于固定的最大上下文长度,并且当输入文本越来越长时,性能往往会下降,即使在没有超出明确上下文窗口的情况下,LLMs 的性能也会随…...

构建智能:利用Gradle项目属性控制构建行为

构建智能:利用Gradle项目属性控制构建行为 Gradle作为一款强大的构建工具,提供了丰富的项目属性管理功能。通过项目属性,开发者可以灵活地控制构建行为,实现条件编译、动态配置和多环境构建等高级功能。本文将详细解释如何在Grad…...

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间,是Ascensio System SIA公司出品的,基于Web的,开源的,跨平台的,在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套:文档编辑器、幻灯片编辑…...

SQL labs靶场-SQL注入入门

靶场及环境配置参考 一,工具准备。 推荐下载火狐浏览器,并下载harkbar插件(v2)版本。hackbar使用教程在此不做过多描述。 补充:url栏内部信息会进行url编码。 二,SQL注入-less1。 1,判断传参…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号4

基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,单选题20个为一组,多选题10个为一组,题库目录如下,…...

使用LSTM完成时间序列预测

c 在本教程中,我们将介绍一个简单的示例,旨在帮助初学者入门时间序列预测和 PyTorch 的使用。通过这个示例,你可以学习如何使用 LSTMCell 单元来处理时间序列数据。 我们将使用两个 LSTMCell 单元来学习从不同相位开始的正弦波信号。模型在…...

《数据结构:顺序实现二叉树》

文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构,它是由n&#xff…...

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染,所谓条件渲染,即更具状态不同,选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …...

【防火墙】防火墙NAT、智能选路综合实验

实验拓扑 实验要求 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带宽比例进行选路…...

VUE之---slot插槽

什么是插槽 slot 【插槽】, 是 Vue 的内容分发机制, 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素, 而这一个标签元素是否显示, 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…...

linux、windows、macos,命令终端清屏

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS的命令终端中,清屏的命令或方法各不相同。以下是针对这三种系统的清屏方法: Linux clear命令:这是最常用的清空终端屏幕的命令之一。在终端中输入clear命令后,屏幕上的所有内容…...

【RaspberryPi】树莓派Matlab/Simulink支持包安装与使用

官网支持与兼容性 Raspberry Pi Support from MATLAB - Hardware Support - MATLAB & Simulink Raspberry Pi Support from Simulink - Hardware Support - MATLAB & Simulink Matlab与树莓派兼容性 Simulink与树莓派兼容性 树莓派Matlab&Simulink RaspberryPi支…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...