#键盘事件 #鼠标 #自动化 #键盘 #鼠标事件 #控制 #远程控制

tfc

胖控制器。一个用于模拟鼠标和键盘事件的库。

13个不稳定版本

0.7.0 2024年1月16日
0.6.2 2022年11月7日
0.6.1 2022年5月7日
0.6.0 2021年7月2日
0.5.2 2021年2月28日

#124Unix API

每月21次下载
用于 3 crates

MIT/Apache

200KB
4.5K SLoC

胖控制器

Crates.io Docs.rs License

TFC是一个模拟鼠标和键盘事件的库。这个库是为TFC-server(一个允许通过手机应用远程控制PC的服务器)开发的。

特性

  • 鼠标点击
  • 鼠标移动(相对和绝对)
  • 鼠标滚动(支持平滑滚动的场合)
  • 按键
  • 将Unicode字符转换为按键
  • 输入任意Unicode字符串
  • 获取鼠标位置
  • 获取屏幕大小

平台

  • Linux - 与X11一起
  • Linux - 不使用X11
  • macOS
  • Windows

用法

将以下内容添加到您的Cargo.toml

[dependencies]
tfc = "0.7"

Linux

Linux有两种实现,一种使用X11,另一种仅依赖于Linux内核。不使用X11的实现缺少一些功能。它旨在用于Wayland,但与X11相比,Wayland更受限制,因此缺少一些功能。

默认情况下(启用check-x11功能),将进行构建时X11检测以确定使用哪个实现。禁用默认功能将禁用此检查,并无条件使用Wayland实现。可以使用x11功能无条件选择X11实现。

使用X11

在使用X11实现之前,需要安装X11、XTest和xkbcommon开发库。使用apt,可以使用以下片段。

sudo apt install libx11-dev libxtst-dev libxkbcommon-dev

不使用X11

非X11实现(在代码库中称为Wayland)使用/dev/uinput。在可以使用它之前,TFC需要权限写入设备。要临时授予权限(直到下一次重启),请使用以下片段。

sudo chmod +0666 /dev/uinput

要永久授予权限,请使用以下片段。

# Create a group
sudo groupadd -r uinput
# Add yourself to the group
sudo usermod -aG uinput $USER
# Give the group permissions to use the uinput kernel module
echo 'KERNEL=="uinput", MODE="0660", GROUP="uinput", OPTIONS+="static_node=uinput"' \
| sudo tee /etc/udev/rules.d/60-tfc.rules

如果立即没有效果,请使用以下片段。如果所有其他方法都失败,请重启。

udevadm control --reload-rules && udevadm trigger

要撤销权限,请使用以下代码片段。

sudo rm /etc/udev/rules.d/60-tfc.rules

示例

use tfc::{Context, Error, traits::*};
use std::{f64::consts::PI, thread, time::Duration};

fn main() -> Result<(), Error> {
    let radius = 100.0;
    let steps = 200;
    let revolutions = 3;
    let delay = Duration::from_millis(10);

    let mut ctx = Context::new()?;
    let center = ctx.cursor_location()?;
    let center = (center.0 as f64 - radius, center.1 as f64);

    for step in 0..steps * revolutions {
        thread::sleep(delay);
        let angle = step as f64 * 2.0 * PI / steps as f64;
        let x = (center.0 + radius * angle.cos()).round() as i32;
        let y = (center.1 + radius * angle.sin()).round() as i32;
        ctx.mouse_move_abs(x, y)?;
    }

    Ok(())
}

依赖项

~0–1.5MB
~26K SLoC