#keyboard-events #keyboard-input #mouse-event #mouse #input #keyboard #hook

bin+lib mki

Windows 和 Linux 库,用于注册全局输入钩子并模拟键盘和鼠标事件

2 个版本

0.2.3 2022年10月31日
0.2.2 2022年8月6日
0.2.1 2021年11月16日
0.1.1 2021年7月19日

#291 in 硬件支持

Download history 47/week @ 2024-03-11 66/week @ 2024-03-18 67/week @ 2024-03-25 79/week @ 2024-04-01 47/week @ 2024-04-08 55/week @ 2024-04-15 64/week @ 2024-04-22 49/week @ 2024-04-29 60/week @ 2024-05-06 59/week @ 2024-05-13 54/week @ 2024-05-20 59/week @ 2024-05-27 50/week @ 2024-06-03 38/week @ 2024-06-10 48/week @ 2024-06-17 65/week @ 2024-06-24

212 每月下载量
4 crates 中使用

MIT 许可证

95KB
2.5K SLoC

mki - 鼠标-键盘-输入 crates.io 版本

Windows & Linux 库,用于注册全局输入钩子并模拟键盘和鼠标事件。

特性

  • 无需绑定到单个键即可安装全局键/鼠标事件处理器。
  • 安装每个键/按钮的事件处理器。
  • 在按键时绑定操作。
  • 注册热键组合,如 CTRL+Q,并在它们上调用操作。

示例

查看 examples/readme.rs 中的示例。可以用 cargo run --example readme 运行。

use mki::{bind_key, Action, InhibitEvent, Keyboard, Sequence};
use std::thread;
use std::time::Duration;

fn main() {
    Keyboard::A.bind(|_| {
        println!("A pressed, sending B");
        Keyboard::B.click();
    });
    mki::bind_any_key(Action::handle_kb(|key| {
        use Keyboard::*;
        if matches!(key, S | L | O | W | LeftShift | LeftControl | B) {
            // Ignore outputs from other commands for nicer output
        } else {
            println!("Some key pressed pressed: {:?}", key);
        }
    }));
    mki::bind_any_button(Action::handle_mouse(|button| {
        println!("Mouse button pressed {:?}", button);
    }));
    mki::register_hotkey(&[Keyboard::LeftControl, Keyboard::B], || {
        println!("Ctrl+B Pressed")
    });
    mki::bind_key(
        Keyboard::S,
        Action::sequencing_kb(|_| {
            Sequence::text("LLLLLow").unwrap().send();
            thread::sleep(Duration::from_secs(1));
        }),
    );

    // This binds action to a W key,
    // that W press will not be sent to the following services ( only on windows )
    // whenever Caps Lock is toggled
    // Action will be executed on separate thread.
    bind_key(
        Keyboard::W,
        Action {
            callback: Box::new(|event, state| {
                println!("key: {:?} changed state now is: {:?}", event, state);
            }),
            inhibit: InhibitEvent::maybe(|| {
                if Keyboard::CapsLock.is_toggled() {
                    InhibitEvent::Yes
                } else {
                    InhibitEvent::No
                }
            }),
            sequencer: false,
            defer: true,
        },
    );

    thread::sleep(Duration::from_secs(100));
}

示例2:配置文件

库支持使用 YAML 配置文件加载热键脚本。查看 using_config.rs 示例以了解更详细的示例。下面是一个简短的示例。

---
bind:
  - description: Whenever Ctrl+L is clicked click K as well
    key:
      - LeftControl
      - L
    action:
      click:
        key:
          - K

库提供了一个二进制 mki,可以用来加载脚本。

mki 二进制文件

库提供了一个 mki 二进制文件,它接受一个参数:一个指向 .yaml 文件的路径。文件将被解析,它将打印注册的热键类型,并无限期地监听输入。

它实际上是一个迷你热键应用。

线程模型

强烈建议使用默认的 bind,这将为新绑定生成新线程。
有一个选项可以对事件进行 sequence,这将导致它们在单独的线程中依次调用。
对事件进行 callback 的选项将导致调用检测到的线程。

使用的命名法

  • handle -> 生成新线程。
  • sequence -> 将给定的事件入队到单个线程中,该线程将依次处理所有事件。
  • callback -> 当检测到键时,与键所在的同一线程上的回调,建议不要阻塞该线程或安排其他按键,因为这可能会导致处理器被静默注销。

Linux

请注意,在Linux上运行应用程序需要root权限。

Linux依赖项

libxtst-dev

Linux注意事项

目前,Linux实现将在库首次调用时休眠100毫秒。
否则,可能会错过一些初始按键。

交叉开发 Linux -> Windows

交叉编译。

在Linux上交叉编译Windows

cargo install cross
cross check --target x86_64-pc-windows-gnu

待办事项

  • 是否应该支持 are_pressed 鼠标?目前配置中的 Pressed 忽略鼠标。
  • 在Linux和Windows上缺少获取鼠标位置。
未来可能考虑的事项
  • 放弃那些初始化时间不确定的静态状态,而是引入一个 Context。然而,来自库的回调仍然需要一个全局访问器,但这肯定会更好。
  • 是否应该移除sequenced,而是引入通道方式?通过存储一个TX Vec可以传播事件。这有一个问题,那就是发送鼠标位置会有些尴尬。因为State枚举与事件枚举是分开的。也许应该删除State,而是使用Up和down枚举?但这会使键盘枚举变得有些混乱。

0.3发布计划

  • 很希望能够在Windows上支持多屏。目前我没有多屏,所以很难测试。
  • Linux支持鼠标实时跟踪回调
  • 添加调试模式 - --debug,当点击已注册的热键时会打印。

变更日志

0.2.2

  • 依赖项更新,修复了Linux #3的一些问题

0.2发布

  • 鼠标支持位置。
  • Windows支持鼠标实时跟踪回调。
  • 鼠标支持在给定坐标处发送按键 - 添加了click_at。
  • Linux显示使用目前非常丑陋,只需将其更改为lambda。
  • 各种API破坏性更改。

支持

如果您想感谢这个repo给您带来的东西,您可以通过https://www.buymeacoffee.com/fulara来做到这一点。

依赖项

~1.8–3.5MB
~70K SLoC