rust 如何在用户不按Enter键的情况下获得键盘输入?

uhry853o  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(297)

我会使用ncurses,但我希望它能在Windows上运行。在C++中,我可以使用conio中的kbhit()getch()来首先检查字符是否被按下,然后获取它。
我想在Rust中找到类似的东西。

carvr3hs

carvr3hs1#

使用crate device_query,您可以查询键盘状态,而无需使用活动窗口。你只需要在Cargo.toml文件中添加这个crate的依赖项:

[dependencies]
device_query = "0.1.0"

它的用法很简单,类似于kbhit()getch()。不同的是,你会收到一个Vec的按键(Keycode),如果没有按键,这个Vec将是空的。一次调用就可以同时使用kbhit()getch()的功能。

use device_query::{DeviceQuery, DeviceState, Keycode};

fn main() {
    let device_state = DeviceState::new();
    loop {
        let keys: Vec<Keycode> = device_state.get_keys();
        for key in keys.iter() {
            println!("Pressed key: {:?}", key);
        }
    }
}

这个程序将打印出控制台上所有按下的键。要检查是否按下了任何键(仅适用于kbhit()),可以在返回的Vec<>上使用is_empty(),如下所示:

let keys: Vec<Keycode> = device_state.get_keys();
if !keys.is_empty(){
    println!("kbhit");
}
uidvcgyl

uidvcgyl2#

你仍然可以做一些事情,

extern {
    fn _getch() -> core::ffi::c_char;
}

fn getch() -> char {
    unsafe {
        _getch() as char
    }
}
iih3973s

iih3973s3#

你可以在rust中获取键盘事件而不需要按回车键。作为开发依赖项添加到k_board,这是一个轻量级的crate,开发的目的是使用低级资源在原始模式下提供键盘监听器(它不像其他crate那样具有依赖项),我附上了如何从键盘捕获任何字母。
cargo add k_board

use k_board::{Keyboard, Keys};

fn main() {
    println!("[*] I use k_board lightweight software");
    println!("[ ] I use heavyweight software");
    for key in Keyboard::new() {
        match key {
            Keys::Up => {
                std::process::Command::new("clear").status().unwrap();
                println!("[*] I use k_board lightweight software");
                println!("[ ] I use heavyweight software");
            }
            Keys::Down => {
                std::process::Command::new("clear").status().unwrap();
                println!("[ ] I use k_board lightweight software");
                println!("[*] I use heavyweight software");
            }
            Keys::Enter => {
                break;
            }
            _ => {}
        }
    }
}

这里我附上钥匙和事件的清单

pub enum Keys {
    Up,
    Down,
    Left,
    Right,
    Enter,
    Space,
    Delete,
    Escape,
    Plus,
    Minus,
    Equal,
    Power,                 ^
    Slash,                 /
    Backslash,             \
    Asterisk,              *
    Point,
    Comma,
    Hashtag,
    Pipe,                  |
    Percent,               %
    Ampersand,
    Currency,              $
    TwoPoints,             :
    Semicolon,             ;
    OpenSquareBracket,     [
    CloseSquareBracket,    ]
    OpenCurlyBrace,        {
    CloseCurlyBrace,       }
    OpenQuestionMark,      ¿
    CloseQuestionMark,     ?
    OpenParenthesis,       (
    CloseParenthesis,      )
    LessThan,              <
    GreaterThan,           >
    Apostrophe,            ' 
    At,                    @
    Home,
    End,
    Tab,
    Backtab,
    Insert,
    Letter(char),
    Number(u8),
    F(u8),
    Ctrl(char),
    Alt(char),
    Null,
}

相关问题