Rust跨平台输入模拟库enigo的使用,enigo提供键盘鼠标自动化控制功能
以下是关于Rust跨平台输入模拟库enigo的使用介绍和完整示例代码:
enigo介绍
enigo是一个跨平台的输入模拟库,提供键盘和鼠标的自动化控制功能。支持以下平台:
- Linux (X11/Wayland/libei)
- macOS
- Windows
- 支持序列化/反序列化
示例代码
let mut enigo = Enigo::new(&Settings::default()).unwrap();
enigo.move_mouse(500, 200, Abs).unwrap();
enigo.button(Button::Left, Click).unwrap();
enigo.text("Hello World! here is a lot of text ❤️").unwrap();
完整使用示例
use enigo::*;
fn main() {
// 创建enigo实例
let mut enigo = Enigo::new(&Settings::default()).unwrap();
// 移动鼠标到绝对位置(500,200)
enigo.move_mouse(500, 200, Abs).unwrap();
// 点击左键
enigo.button(Button::Left, Click).unwrap();
// 输入文本
enigo.text("Hello from enigo!").unwrap();
// 按键组合示例(如Ctrl+C)
enigo.key(Key::Control, Click).unwrap();
enigo.key(Key::Layout('c'), Click).unwrap();
enigo.key(Key::Control, Release).unwrap();
}
安装依赖
在Cargo.toml中添加:
[dependencies]
enigo = "0.5.0"
运行时依赖(Linux)
- Debian/Ubuntu:
apt install libxdo-dev
- Arch:
pacman -S xdotool
- Fedora:
dnf install libX11-devel libxdo-devel
注意事项
- 某些平台可能需要额外权限才能模拟输入
- 测试时会影响实际鼠标/键盘操作
- 完整功能需要根据平台启用相应特性
enigo提供了跨平台的输入模拟能力,可以用于自动化测试、宏录制等场景。
完整示例demo
基于上述内容,这里提供一个更完整的自动化操作示例:
use enigo::*;
use std::{thread, time::Duration};
fn main() {
println!("开始enigo自动化演示...");
// 初始化enigo实例
let mut enigo = Enigo::new(&Settings::default()).unwrap();
// 演示鼠标移动和点击
println!("移动鼠标到(300, 300)并点击");
enigo.move_mouse(300, 300, Abs).unwrap();
enigo.button(Button::Left, Click).unwrap();
thread::sleep(Duration::from_secs(1));
// 演示文本输入
println!("输入文本");
enigo.text("Hello, enigo! 这是一个测试文本。").unwrap();
thread::sleep(Duration::from_secs(1));
// 演示组合键Ctrl+A全选
println!("执行Ctrl+A全选");
enigo.key(Key::Control, Click).unwrap();
enigo.key(Key::Layout('a'), Click).unwrap();
enigo.key(Key::Control, Release).unwrap();
thread::sleep(Duration::from_secs(1));
// 演示右键菜单
println!("右键点击打开菜单");
enigo.button(Button::Right, Click).unwrap();
println!("演示完成");
}
这个完整示例演示了:
- 鼠标绝对位置移动
- 左键单击
- 文本输入
- 组合键操作(Ctrl+A)
- 右键菜单操作
- 操作间添加了适当的延迟
使用时请确保:
- 已添加enigo依赖
- 满足对应平台的运行时依赖
- 有必要的权限执行输入模拟操作
1 回复
Rust跨平台输入模拟库enigo使用指南
简介
enigo是一个Rust编写的跨平台输入模拟库,可以控制键盘和鼠标的自动化操作。它支持Windows、macOS和Linux三大主流平台,提供了统一的API来模拟键盘输入、鼠标移动和点击等操作。
功能特性
- 模拟键盘按键(按下、释放、点击)
- 模拟鼠标移动、点击和滚轮
- 支持获取当前鼠标位置
- 跨平台兼容性
- 相对简单的API设计
使用方法
添加依赖
首先在Cargo.toml
中添加enigo依赖:
[dependencies]
enigo = "0.7"
基本示例
use enigo::*;
fn main() {
// 创建enigo实例
let mut enigo = Enigo::new();
// 模拟键盘输入
enigo.key_sequence("Hello, world!");
// 模拟回车键
enigo.key_click(Key::Return);
// 模拟鼠标移动到(100, 100)
enigo.mouse_move_to(100, 100);
// 模拟鼠标左键点击
enigo.mouse_click(MouseButton::Left);
// 模拟鼠标滚轮滚动
enigo.mouse_scroll_y(2); // 向上滚动2个单位
}
键盘操作
use enigo::*;
fn keyboard_example() {
let mut enigo = Enigo::new();
// 单个按键点击
enigo.key_click(Key::Control);
enigo.key_click(Key::Alt);
enigo.key_click(Key::Delete);
// 按键组合 (Ctrl+C)
enigo.key_down(Key::Control);
enigo.key_click(Key::Layout('c'));
enigo.key_up(Key::Control);
// 输入字符串
enigo.key_sequence("This is a test string");
}
鼠标操作
use enigo::*;
fn mouse_example() {
let mut enigo = Enigo::new();
// 获取当前鼠标位置
let (x, y) = enigo.mouse_location();
println!("Current mouse position: {}, {}", x, y);
// 相对移动
enigo.mouse_move_relative(50, 50);
// 绝对移动
enigo.mouse_move_to(500, 300);
// 鼠标点击
enigo.mouse_click(MouseButton::Left);
enigo.mouse_click(MouseButton::Right);
// 鼠标按下和释放
enigo.mouse_down(MouseButton::Left);
// 这里可以插入移动操作实现拖拽
enigo.mouse_up(MouseButton::Left);
// 滚轮操作
enigo.mouse_scroll_y(3); // 向上滚动
enigo.mouse_scroll_y(-2); // 向下滚动
enigo.mouse_scroll_x(1); // 向右滚动
}
平台注意事项
- Linux:需要安装libxdo开发库(如Ubuntu上
sudo apt install libxdo-dev
) - macOS:需要在
Info.plist
中添加辅助功能权限 - Windows:通常不需要额外配置
高级用法
自定义延迟
use enigo::*;
use std::{thread, time};
fn delayed_actions() {
let mut enigo = Enigo::new();
let delay = time::Duration::from_millis(500);
enigo.key_click(Key::Layout('a'));
thread::sleep(delay);
enigo.key_click(Key::Layout('b'));
thread::sleep(delay);
enigo.key_click(Key::Layout('c'));
}
处理特殊按键
use enigo::*;
fn special_keys() {
let mut enigo = Enigo::new();
// 功能键
enigo.key_click(Key::F5);
enigo.key_click(Key::Escape);
// 方向键
enigo.key_click(Key::UpArrow);
enigo.key_click(Key::DownArrow);
enigo.key_click(Key::LeftArrow);
enigo.key_click(Key::RightArrow);
// 其他特殊键
enigo.key_click(Key::CapsLock);
enigo.key_click(Key::Space);
enigo.key_click(Key::Tab);
}
完整示例demo
下面是一个结合键盘和鼠标操作的完整自动化示例:
use enigo::*;
use std::{thread, time::Duration};
fn main() {
// 初始化enigo实例
let mut enigo = Enigo::new();
// 模拟输入用户名和密码
println!("开始模拟登录操作...");
enigo.key_sequence("admin"); // 输入用户名
enigo.key_click(Key::Tab); // 切换到密码输入框
thread::sleep(Duration::from_millis(200));
enigo.key_sequence("password123"); // 输入密码
enigo.key_click(Key::Return); // 回车登录
// 等待2秒让页面加载
thread::sleep(Duration::from_secs(2));
// 模拟鼠标操作 - 点击菜单项
println!("模拟点击菜单...");
enigo.mouse_move_to(300, 150); // 移动到菜单位置
enigo.mouse_click(MouseButton::Left); // 点击菜单
// 模拟滚轮滚动
println!("模拟滚轮滚动...");
for _ in 0..3 {
enigo.mouse_scroll_y(-1); // 向下滚动
thread::sleep(Duration::from_millis(300));
}
// 模拟快捷键操作
println!("模拟快捷键操作...");
enigo.key_down(Key::Control);
enigo.key_click(Key::Layout('s')); // Ctrl+S保存
enigo.key_up(Key::Control);
// 模拟拖拽操作
println!("模拟拖拽操作...");
enigo.mouse_move_to(400, 300);
enigo.mouse_down(MouseButton::Left);
thread::sleep(Duration::from_millis(500));
enigo.mouse_move_relative(100, 50);
enigo.mouse_up(MouseButton::Left);
println!("自动化操作完成!");
}
注意事项
- 在某些操作系统上可能需要特殊权限
- 输入模拟可能会被某些安全软件拦截
- 不同平台的键盘布局处理可能略有差异
- 鼠标操作在Wayland上的支持可能有限
enigo库非常适合需要自动化输入操作的场景,如测试自动化、宏录制播放、辅助工具开发等。其简单的API设计使得集成到现有Rust项目中非常方便。