屏幕找字:使用系统自带组件
其实 Windows 10/11 系统自带的一个强大、免费的屏幕图像文字识别组件,调用该组件生成的 EXE 文件体积很小。
下面我们用 aardio 编程语言写个例子,代码很简单,先上图看效果:
请复制下面的源代码粘贴到 aardio 中,再按「运行」按钮就可以看到上图的效果 —— 程序自动找到了屏幕上的文本,鼠标自动移到了该位置。
import mouse;
import dotNet.ocr;
//创建 OCR 对象
var ocr = dotNet.ocr();
//识别屏幕上的文字
var ocrResult = ocr.detectScreen()
//查找文字在屏幕上的位置
var x,y = ocrResult.findPoint(
"把鼠标移动到这里",0.1
);
mouse.moveTo(x,y,true)
上面就是一个完整的程序了,aardio 写程序就这么简单。
这个系统 OCR 组件其实是一个 UWP 组件,不过 aardio 调用 .NET 组件、或者调用 UWP 组件都非常方便。参考「 aardio 范例 > 调用其他语言 > dotNet > 调用 UWP 接口 」:
屏幕找字:调用开源、免费、强大、绿色的 chineseocrlite
aardio 基于 chineseocrlite 封装了 string.ocrLite 扩展库,支持生成绿色、独立的 EXE 文件,带模型生成的EXE打包后仅 十几 MB。
调用源代码很简单,先上图看效果:
请复制下面的源代码,粘贴到 aardio 中,再按「运行」按钮就可以看到上图的效果 ——鼠标自动移到了屏幕上指定文本所在位置。
import mouse;
import string.ocrLite;
import string.ocrLite.defaultModels;
//创建 OCR 对象
var ocr = string.ocrLite();
//识别屏幕上的文字
var ocrResult = ocr.detectScreen();
//查找文字在屏幕上的位置
var x,y = ocrResult.findPoint(
"把鼠标移动到这里",0.2
);
mouse.moveTo(x,y,true);
大家可能注意到了,aardio 中很多库的接口、用法都一样,可以一通百通。
如果是制作自动化机器人之类的软件,识别屏幕上文字的能力就好像机器人的眼睛一样重要。尤其是现在很多无窗口界面的软件,通过 OCR 组件就可以较好地定位到界面上指定的部位进行准确的操作。大家可以试试 OCR 结合 aardio 标准库里的 winex.mouse, mouse 等可以实现非常酷的效果,另外 aardio 工具里的「探测器->窗口探测器」也很重要(可以生成示例代码)。
屏幕找色
找色很简单,请复制下面的范例代码粘贴到 aardio 中,然后点「运行」就可以看到效果:
import gdi;
import win;
import mouse;
import soImage;
//抓屏
var imgScreen = soImage();
imgScreen.capture();
//在图像上搜索指定颜色的点,
//第一个参数是一个表示查找颜色的数值,更多参数用法请查看智能提示
var x,y = imgScreen.findColor( gdi.RGB(48,171,53) );
//返回该坐标所在显示器左上角位置
var scrX,scrY = win.getScreenPos(x=x,y=y);
//快速移动鼠标(相对移动)
mouse.move(scrX,scrY,true);
//获取虚拟屏幕位置,双屏幕时可能起始坐标可能返回负数
var scrX,scrY = win.getScreenPos();
//慢速移动鼠标,显示移动轨迹
mouse.moveTo(x+scrX,y+scrY,true);
注意 mouse.moveTo() 函数移动鼠标时可以看到移动轨迹,改为 mouse.move() 函数可以直接移动到指定坐标。
屏幕找图
aardio 里屏幕找图就更简单了,首先加载要查找的图像:
import soImage;
var img = soImage();
img.load("/res/find.jpg");
"/res/find.jpg" 可以是硬盘上的图像文件路径,也可以是 EXE 资源文件路径(可以生成独立 EXE )。
也可以自内存直接加载图像,如下用第 2 个参数指定图像文件后缀名:
img.setBytes( imgBytes,"*.png");
查找图像要尽可能的小,并尽可能裁剪去掉背景,突出查找特征。
使用 img.findImage 全屏找图,也可以使用下面的函数在指定窗口内找图:
var sm,x,y = imgFind.findImageInWindow(hwnd);
上面的 hwnd 参数指定窗口句柄。返回值 sm 为相似度( 0 到 100 之间的值,100 为完全相似,0 为完全不相似 ),返回值 x,y 为找到图像的右下角坐标。
自动化操作
找图找色找字的目的是自动化操作,aardio 与自动化操作有关的库如下:
win //窗口操作
winex //外部程序窗口操作
winex.accObject //Microsoft Active Accessibility 自动化接口
winex.key //后台键盘操作
winex.mouse //后台鼠标操作
key //键盘操作
mouse //鼠标操作
process //进程操作
soImage //找图找色
与自动化操作有关的范例:
网页自动化就不必用上面这些了,直接使用浏览器控件就可以,可参考我之前写的文章 更简单地自动化操作浏览器 。「aardio 范例 > Web 界面」也可以看一下: