10 个版本
0.3.1 | 2024 年 8 月 1 日 |
---|---|
0.3.0 | 2024 年 7 月 27 日 |
0.2.2 | 2024 年 7 月 27 日 |
0.1.8 | 2024 年 7 月 22 日 |
#121 in GUI
1,197 每月下载量
125KB
2K SLoC
Rustautogui
Rustautogui crate,在 Al Sweigarts 的 Python 库 Pyautogui 的基础上制作。
Rustautogui 允许您控制鼠标和键盘来自动化与其他应用程序的交互。该crate支持 Windows 和 Linux,自 0.2.0 版本起支持 macOS。
主要功能
- 捕获屏幕
- 在屏幕上找到图像
- 移动鼠标到像素坐标
- 点击鼠标按钮
- 输入键盘字符串
- 输入键盘命令
- 键盘多键按下
- 在屏幕上找到图像并将鼠标移动到它上面
- 检测光标位置
注意:此库不使用 OpenCV 模板匹配,与 Python 版本不同。OpenCV 拥有完全优化的模板匹配,而此处使用了多线程,但尚未启用 GPU 加速。因此,屏幕上找到图像可能比使用 OpenCV 的 Python 对应版本慢,但速度仍然令人满意。一旦包含分段相关算法,速度将进一步提高。目标是在将来包括 GPU 加速。
不在此库中包含 OpenCV 的原因是,安装所有 rust 绑定和依赖项可能是一个繁琐且耗时的过程。我不想让用户在安装所需所有内容之前花费数小时来构建此库。因此,模板匹配已经完全自主研发。
分段模板匹配算法
Rustautogui crate 将包含一种新的模板匹配算法,使用交叉相关,目前尚未实现。目前,已经撰写了一篇关于新算法的论文,一旦提交到 arxiv,它将被发布在此库中
因此,请关注更新。一旦发布 1.0 版本,它将包含新算法。目前,所有代码都已为新算法做好准备,1.0 版本的代码也已存在。因此,如果您此时选择分段匹配模式,您将收到一个 panic。
安装
运行 cargo add rustautogui
或者在您的 Cargo.toml 文件中添加 crate:
rustautogui= "0.3.1"
对于 Linux,还需要安装运行:
sudoapt-get update
sudoapt-get install libx11-dev libxtst-dev
对于macOS:不要忘记给予必要的权限
用法
use rustautogui::RustAutoGui
let mut rustautogui = RustAutoGui::new(debug:false); // create rustautogui instance
rustautogui.load_and_prepare_template(
template_path: "template.png",
region: Some((0,0,1000,1000)),
match_mode:rustautogui::MatchMode::FFT,
max_segments:&None
); // load a template image for screen matching
参数是模板路径、Option<(x,y,width,height)>区域参数。Option被使用是因为它可以设置为None,这意味着它将在整个屏幕上搜索。Matchmode可以是MatchMode::Segmented(一旦实现)或MatchMode::FFT。FFT用于傅里叶变换,如果模板大小相当大,则FFT可能更好。如果使用较小的模板,则Segmented匹配模式将被优先考虑并且速度更快。max_segments参数仅在Segmented匹配模式下使用,对于FFT匹配模式并不重要,所以目前最好将其设置为&None
如果您想最大化速度,您的模板和搜索区域应尽可能小。例如,如果您正在寻找按钮的图像,可能不需要整个按钮图像,而只需要其中的一部分。有各种pyautogui教程可以解释这一点。因此,如果已经使用较小的图像来加快算法速度,请选择分段匹配模式,这将提供更高的速度。
rustautogui.change_prepared_settings(
region:Some((0,0,1000,1000)),
rustautogui::MatchMode::FFT,
max_segments:&None
); // change template matching settings, if template is already loaded
let found_locations: Option<Vec<(u32, u32, f64)>> = rustautogui.find_image_on_screen(precision:0.9); // returns pixel coordinates for prepared template
// on screen. Returns list of coordinates that have correlation higher than inserted precision parameter
// must have prepared template before
// returns locations that have correlation higher than precision, ordered from highest to lowest.
// Mouse moves to highest correlation point
let found_locations: Option<Vec<(u32, u32, f64)>> = rustautogui.find_image_on_screen_and_move_mouse(precision:0.9, moving_time:1.0);
// finds template image on screen and automatically moves mouse
// cursor to the middle of the image. Matches only single
// position with highest correlation value
// must have prepared template before
// returns locations that have correlation higher than precision, ordered from highest to lowest.
// Mouse moves to highest correlation point
重要:在使用多个显示器时,Linux和Windows/macOS之间的区别。在Windows和macOS上,只能在主显示器上搜索模板图像。
在Linux上,可以在所有显示器上进行搜索,坐标(0, 0)从左上角开始。最左侧的显示器将有零X坐标,而最上面的显示器将有零Y坐标。
rustautogui.left_click(); // left mouse click
rustautogui.right_click(); // right mouse click
rustautogui.double_click(); // double left click
rustautogui.keyboard_input(input: "test", shifted:&false); // input string, or better say, do the sequence of key presses
rustautogui.keyboard_command(input:"return"); //press a keyboard button
rustautogui.keyboard_multi_key(input1: "shift", input2:"control", input3: Some("t")) // Executed multiple key press at same time. third argument is optional
rustautogui.change_debug_state(true); // change debugging
rustautogui.scroll_up();
rustautogui.scroll_down();
有关所有键盘命令,请检查Keyboard_commands.txt,这是一份大致列出可能的输入的列表
调试模式将输出分段图片中的段落数量、算法运行时间和保存分段图像。
rustautogui.save_screenshot("test.png"); //saves screen screenshot
use rustautogui::mouse;
fn main() {
mouse::mouse_position::print_mouse_position();
}
在0.3.0之前,此函数会弹出窗口,现在它只是打印。这是为了减少依赖而进行的更改。这是一个辅助函数,用于确定屏幕上的坐标,当确定区域或鼠标移动目标时很有用。
crate是如何工作的
在Windows上,api通过使用winapi crate与winapi交互,在Linux上通过使用x11 crate与x11 api交互,而在macOS上通过使用core-graphics crate与core-graphics交互。当使用::new函数创建RustAutoGui实例时,Screen、Mouse和Keyboard结构也将被初始化并存储在RustAutoGui结构中。Screen结构为屏幕图像存储预分配内存段。
执行find_image_on_screen_function将在模板和屏幕上进行交叉相关。问题是,交叉相关包括某些可以预先计算的步骤,这些步骤不应成为主要相关过程的一部分,因此它不会减慢速度。
因此,创建了load_and_prepare_template函数,以便您可以在使用find_image_on_screen进行相关之前预加载模板图像并进行预计算。这就是为什么您应该在代码中速度不是关键的时刻预初始化模板,以便在需要更快地模板匹配时准备好。
依赖关系
~10MB
~155K SLoC