当前位置: 首页 > 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支…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘&#xf…...

面试高频问题

文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...