use keyboard_codes::{Key, KeyCodeMapper, KeyParseError, Modifier, Platform};
use std::thread;
use std::time::Duration;
fn type_key(key: &str) -> Result<(), KeyParseError> {
if let Ok(key) = key.parse::<Key>() {
let vk_code = key.to_code(Platform::current()) as u16;
press_key(vk_code);
return Ok(());
}
if let Ok(modifier) = key.parse::<Modifier>() {
let vk_code = modifier.to_code(Platform::current()) as u16;
press_key(vk_code);
return Ok(());
}
Err(KeyParseError::UnknownKey(key.to_string()))
}
fn type_combo(keys: &[&str]) -> Result<(), KeyParseError> {
for key in keys {
if let Ok(modifier) = key.parse::<Modifier>() {
let vk_code = modifier.to_code(Platform::current()) as u16;
press_key(vk_code);
}
}
for key in keys {
if let Ok(key) = key.parse::<Key>() {
let vk_code = key.to_code(Platform::current()) as u16;
press_key(vk_code);
release_key(vk_code);
}
}
for key in keys.iter().rev() {
if let Ok(modifier) = key.parse::<Modifier>() {
let vk_code = modifier.to_code(Platform::current()) as u16;
release_key(vk_code);
}
}
Ok(())
}
fn press_key(vk_code: u16) {
println!("press key {:?}", vk_code);
thread::sleep(Duration::from_millis(50));
}
fn release_key(vk_code: u16) {
println!("release key {:?}", vk_code);
}
fn main() {
println!("直接使用Key/Modifier的键盘模拟测试:");
let single_keys = ["A", "Control", "Shift", "Key1", "Escape"];
for key in single_keys {
if let Err(e) = type_key(key) {
println!("输入 '{}' 失败: {}", key, e);
}
}
let combos = vec![vec!["Control", "C"], vec!["Control", "Shift", "Escape"]];
for keys in combos {
println!("\n模拟组合键: {:?}", keys);
if let Err(e) = type_combo(&keys) {
println!("组合键 {:?} 失败: {}", keys, e);
}
}
}