gpt4 book ai didi

rust - 检测到在rust中的按键按下?

转载 作者:行者123 更新时间:2023-12-03 11:24:01 34 4
gpt4 key购买 nike

我想在Rust中检测到一个keydown事件,然后检查是否按下了组合键,以便基于此执行进一步的操作。
因此,基本上在我的Rust应用程序中支持键盘快捷键

我看过一些箱子,例如ncurses,但它们不符合我的要求...

最佳答案

ANSI终端(Linux,macOS)的最佳解决方案

如果您不需要Windows支持,那么最好的方法是 termion

这是一个用于操作终端的库。您可以在其中检测按键事件,甚至可以检测到键盘快捷键。而且它真的很轻巧!仅 22.78 kB (从1.5.5版开始)。

我整理了一个快速程序,展示了一些快捷方式。

将此代码添加到main.rs中,将termion = "1.5.5"添加到Cargo.toml中,然后以cargo run开头!

use std::io::{stdin, stdout, Write};
use termion::event::Key;
use termion::input::TermRead;
use termion::raw::IntoRawMode;

fn main() {
let stdin = stdin();
//setting up stdout and going into raw mode
let mut stdout = stdout().into_raw_mode().unwrap();
//printing welcoming message, clearing the screen and going to left top corner with the cursor
write!(stdout, r#"{}{}ctrl + q to exit, ctrl + h to print "Hello world!", alt + t to print "termion is cool""#, termion::cursor::Goto(1, 1), termion::clear::All)
.unwrap();
stdout.flush().unwrap();

//detecting keydown events
for c in stdin.keys() {
//clearing the screen and going to top left corner
write!(
stdout,
"{}{}",
termion::cursor::Goto(1, 1),
termion::clear::All
)
.unwrap();

//i reckon this speaks for itself
match c.unwrap() {
Key::Ctrl('h') => println!("Hello world!"),
Key::Ctrl('q') => break,
Key::Alt('t') => println!("termion is cool"),
_ => (),
}

stdout.flush().unwrap();
}
}

跨平台解决方案

如果需要支持Windows和所有其他平台,则可以使用 crossterm 。这是一个相当不错的图书馆,而且比Termion还重。它是 98.06 kB (从0.16.0版开始)。

这是与上述相同的程序,但使用crossterm编写。

将此代码添加到 main.rs中,将 crossterm = "0.16.0"添加到 Cargo.toml中,然后使用 cargo run尝试一下!
//importing in execute! macro
#[macro_use]
extern crate crossterm;

use crossterm::cursor;
use crossterm::event::{read, Event, KeyCode, KeyEvent, KeyModifiers};
use crossterm::style::Print;
use crossterm::terminal::{disable_raw_mode, enable_raw_mode, Clear, ClearType};
use std::io::{stdout, Write};

fn main() {
let mut stdout = stdout();
//going into raw mode
enable_raw_mode().unwrap();

//clearing the screen, going to top left corner and printing welcoming message
execute!(stdout, Clear(ClearType::All), cursor::MoveTo(0, 0), Print(r#"ctrl + q to exit, ctrl + h to print "Hello world", alt + t to print "crossterm is cool""#))
.unwrap();

//key detection
loop {
//going to top left corner
execute!(stdout, cursor::MoveTo(0, 0)).unwrap();

//matching the key
match read().unwrap() {
//i think this speaks for itself
Event::Key(KeyEvent {
code: KeyCode::Char('h'),
modifiers: KeyModifiers::CONTROL,
//clearing the screen and printing our message
}) => execute!(stdout, Clear(ClearType::All), Print("Hello world!")).unwrap(),
Event::Key(KeyEvent {
code: KeyCode::Char('t'),
modifiers: KeyModifiers::ALT,
}) => execute!(stdout, Clear(ClearType::All), Print("crossterm is cool")).unwrap(),
Event::Key(KeyEvent {
code: KeyCode::Char('q'),
modifiers: KeyModifiers::CONTROL,
}) => break,
_ => (),
}
}

//disabling raw mode
disable_raw_mode().unwrap();
}

我不会说谎,这比 termion解决方案更难读,但是可以完成相同的工作。我以前没有 crossterm的经验,所以这段代码实际上可能不是最好的,但是很不错。

是否在寻找一种方法,仅检测没有任何修改键(Shift,Control,Alt)的按键?检查以下简化代码:
//-- code --
let no_modifiers = KeyModifiers::empty();

loop {
//--code--

match read().unwrap() {
Event::Key(KeyEvent {
code: KeyCode::Char('a'),
modifiers: no_modifiers,
}) => //--code--
}

//--code--
}

//--code--

这里的重要部分是 no_modifiers变量的创建。由于我们不想使用任何修饰符,因此创建不带任何修饰符的 KeyModifiers实例的唯一方法是调用不包含任何修饰符的 empty() 函数。我们需要此变量,因为我们无法在模式中调用函数(在这种情况下为结构初始化)。

关于rust - 检测到在rust中的按键按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60130532/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com