2 个版本
0.2.3 | 2022年10月31日 |
---|---|
0.2.2 | 2022年8月6日 |
0.2.1 |
|
0.1.1 |
|
#291 in 硬件支持
212 每月下载量
在 4 crates 中使用
95KB
2.5K SLoC
mki - 鼠标-键盘-输入
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