#键盘输入 #鼠标 #输入 #键盘 #输入事件 #鼠标事件 #Linux

mouse-keyboard-input

在任何发行版上以及X11或Wayland上发送鼠标和键盘事件

16个版本 (7个破坏性更新)

0.9.1 2024年6月7日
0.8.1 2024年5月19日
0.7.3 2024年5月18日
0.6.1 2024年5月6日
0.2.3 2023年2月14日

#235 in 硬件支持

MIT/Apache

62KB
1.5K SLoC

为Rust提供易于使用的 uinput 包装器。

比任何其他Linux输入仿真的库都要快(更低延迟)。

通过在Linux中创建虚拟设备,允许您发送键盘和鼠标事件。

uinput 是一个基本的Linux库,因此它可以在任何发行版以及 X11Wayland 上运行。

为鼠标滚轮发送高分辨率事件,允许更平滑的滚动和更好的精度。

库设计上安全,当调用 VirtualDevice 的析构函数时自动释放资源。与其他Rust的 uinput 库相比,依赖项是最新的。

安装

要无 sudo 使用,请将当前用户添加到输入组(将 user 替换为您的用户名)

sudo usermod -a -G input user
sudo reboot

所需库

在Ubuntu和Debian上

sudo apt install libudev-dev libevdev-dev libhidapi-dev

添加到 Cargo.toml

mouse-keyboard-input = "0.9.1"

要使用最新开发版本

mouse-keyboard-input = { git = "https://github.com/positiveway/mouse-keyboard-input", branch = "main" }

linux上的armv7构建

构建脚本可在 /scripts/build_armv7.sh 中找到

cd ./scripts
sudo chmod +x ./build_armv7.sh #make script executable
./build_armv7.sh

为了使其工作,需要安装 arm-linux-gnueabi-gcc

对于Ubuntu

sudo apt install gcc-arm-linux-gnueabi

安装包后需要重启

有关更多详细信息,请参阅 官方讨论

如何使用

函数

click(button_or_key) - click mouse button or type a key
press(button_or_key)
release(button_or_key)

smooth_move_mouse(x, y) - gradually move mouse from the current position on screen by (x, y) pixels. this method is preferred

move_mouse(x, y) - move mouse instantly
move_mouse_x(value) - move mouse instantly
move_mouse_y(value)- move mouse instantly

smooth_scroll(x, y) - gradually scroll. this method is preferred

scroll_x(value) - instantly scroll horizontally
scroll_y(value) - instantly scroll vertically

按钮列表

鼠标

BTN_LEFT - left mouse button
BTN_RIGHT - right mouse button
BTN_MIDDLE - middle mouse button

键盘

键码可以在 /src/key_codes.rs 中找到

示例

KEY_A
KEY_LEFTSHIFT
KEY_LEFTMETA (Meta means Windows button on Linux)

代码示例

鼠标

use mouse_keyboard_input::VirtualDevice;
use mouse_keyboard_input::key_codes::*;
use std::thread;
use std::time::Duration;

fn main() {
    let mut device = VirtualDevice::default().unwrap();

    for _ in 1..3 {
        thread::sleep(Duration::from_secs(1));

        // gradually scroll down by 100
        device.smooth_scroll(0, -100).unwrap();
        // gradually move cursor 250 pixels up and 250 pixels to the right from the current position
        device.smooth_move_mouse(250, 250).unwrap();
        //click the left mouse button
        device.click(BTN_RIGHT).unwrap();
    }

    for _ in 1..2 {
        thread::sleep(Duration::from_secs(1));

        // scroll down by 100
        device.scroll_y(-100).unwrap();
        // instantly move cursor 250 pixels up and 250 pixels to the right from the current position
        device.move_mouse(250, 250).unwrap();
        //click the left mouse button
        device.click(BTN_RIGHT).unwrap();
    }
}

键盘

use mouse_keyboard_input::VirtualDevice;
use mouse_keyboard_input::key_codes::*;
use std::thread;
use std::time::Duration;

fn main() {
    let mut device = VirtualDevice::default().unwrap();

    thread::sleep(Duration::from_secs(2));

    // type hello
    for key in [KEY_H, KEY_E, KEY_L, KEY_L, KEY_O] {
        device.click(key).unwrap();
    }
}

还支持从多个线程发送事件。请参阅 /examples/channels.rs

贡献者

基于 github.com/meh/rust-uinput

依赖项

~2MB
~41K SLoC