keyboard-codes 0.3.0

Cross-platform keyboard key code mapping and conversion
Documentation
//! 直接使用Key和Modifier的键盘模拟示例
//! 运行: cargo run --example typing_simulation_direct --features windows-sys

use keyboard_codes::{Key, KeyCodeMapper, KeyParseError, Modifier, Platform};
use std::thread;
use std::time::Duration;
// use windows_sys::Win32::UI::Input::KeyboardAndMouse;

/// 模拟单个键输入
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(())
}

// Windows平台按键模拟实现
fn press_key(vk_code: u16) {
    // unsafe {
    //     KeyboardAndMouse::keybd_event(
    //         vk_code,
    //         0,
    //         KeyboardAndMouse::KEYEVENTF_EXTENDEDKEY,
    //         0
    //     );
    // }
    println!("press key {:?}", vk_code);
    thread::sleep(Duration::from_millis(50));
}

fn release_key(vk_code: u16) {
    // unsafe {
    //     KeyboardAndMouse::keybd_event(
    //         vk_code,
    //         0,
    //         KeyboardAndMouse::KEYEVENTF_EXTENDEDKEY | KeyboardAndMouse::KEYEVENTF_KEYUP,
    //         0
    //     );
    // }
    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);
        }
    }
}