Rust 上窗口的钥匙钩

Key hook for window on Rust

提问人:Gewi 提问时间:8/28/2023 最后编辑:Chayim FriedmanGewi 更新时间:8/31/2023 访问量:56

问:

你能帮忙解决事件捕捉问题吗? 我有一个窗口,如果窗口现在未处于聚焦状态,我想捕获键盘事件。 对于它在覆盖构造函数中,我使用如下:

    let (button_sender, button_receiver) = mpsc::channel(10000);
    match keylogger::install_hook(Box::new(move |button| {
        println!("press {}", button);
        let button_sender1 = button_sender.clone();
        tokio::spawn(async move {
            println!("tokio::spawn");
            button_sender1.send(button).await.unwrap();
        });
    })) {
        Ok(..) => {
            #[cfg(debug_assertions)]
            println!("Hook installed");
        }
        Err(e) => {
            eprintln!("{}", e);
        }
    };

之后,在事件循环中,我检查了何时按下键:

custom_window_frame(ctx, |ui| {
let pressed_button: KeyboardButton = match self.button_receiver.try_recv() {
  Ok(button) => {
    dbg!(button);
    button
}
  Err(_) => KeyboardButton::Undefined,
};

在我签入键后,例如但是如果我的窗口没有聚焦并且我尝试使用,例如 Esc 或 F12,我会看到下一个错误:if pressed_button == KeyboardButton::F12

thread 'main' has overflowed its stack
error: process didn't exit successfully: `target\debug\live-translator-rs.exe` (exit code: 0xc000041d)

也许有人和 tokio 一起工作过,也许有人知道我做错了什么。谢谢。

有趣的是,当我尝试捕捉鼠标移动事件时,当窗口聚焦时,一切正常。但是当焦点丢失时,事件只是停止做某事,没有任何线程溢出错误。

用户界面 输入 键盘 Rust-Tokio

评论

0赞 Peter Hall 8/28/2023
您使用的是什么 UI 框架?
0赞 Gewi 8/28/2023
eGUI 库:docs.rs/egui/latest/egui
0赞 Jmb 8/28/2023
请不要上传代码/数据/错误的图片。

答: 暂无答案