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

注意事项

  1. 某些平台可能需要额外权限才能模拟输入
  2. 测试时会影响实际鼠标/键盘操作
  3. 完整功能需要根据平台启用相应特性

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!("演示完成");
}

这个完整示例演示了:

  1. 鼠标绝对位置移动
  2. 左键单击
  3. 文本输入
  4. 组合键操作(Ctrl+A)
  5. 右键菜单操作
  6. 操作间添加了适当的延迟

使用时请确保:

  1. 已添加enigo依赖
  2. 满足对应平台的运行时依赖
  3. 有必要的权限执行输入模拟操作

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);  // 向右滚动
}

平台注意事项

  1. Linux:需要安装libxdo开发库(如Ubuntu上sudo apt install libxdo-dev
  2. macOS:需要在Info.plist中添加辅助功能权限
  3. 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!("自动化操作完成!");
}

注意事项

  1. 在某些操作系统上可能需要特殊权限
  2. 输入模拟可能会被某些安全软件拦截
  3. 不同平台的键盘布局处理可能略有差异
  4. 鼠标操作在Wayland上的支持可能有限

enigo库非常适合需要自动化输入操作的场景,如测试自动化、宏录制播放、辅助工具开发等。其简单的API设计使得集成到现有Rust项目中非常方便。

回到顶部