extern crate winapi;
use winapi::um::winuser::{INPUT, INPUT_KEYBOARD, KEYBDINPUT, SendInput, KEYEVENTF_KEYUP};
use std::collections::HashMap;
// 定义虚拟键码
const VK_A: u16 = 0x41;
const VK_S: u16 = 0x53;
const VK_D: u16 = 0x44;
const VK_F: u16 = 0x46;
const VK_G: u16 = 0x47;
// 定义按下键的函数
fn press_key(vk: u16) {
let mut input = INPUT {
type_: INPUT_KEYBOARD,
u: unsafe { std::mem::zeroed() },
};
unsafe {
*input.u.ki_mut() = KEYBDINPUT {
wVk: vk,
wScan: 0,
dwFlags: 0,
time: 0,
dwExtraInfo: 0usize,
};
SendInput(1, &mut input, std::mem::size_of::<INPUT>() as i32);
}
}
// 定义释放键的函数
fn release_key(vk: u16) {
let mut input = INPUT {
type_: INPUT_KEYBOARD,
u: unsafe { std::mem::zeroed() },
};
unsafe {
*input.u.ki_mut() = KEYBDINPUT {
wVk: vk,
wScan: 0,
dwFlags: KEYEVENTF_KEYUP,
time: 0,
dwExtraInfo: 0usize,
};
SendInput(1, &mut input, std::mem::size_of::<INPUT>() as i32);
}
}
// 定义按下并释放按键的函数
fn send_key(vk: u16) {
press_key(vk);
release_key(vk);
}
// 定义发送按键序列的函数
fn send_keys(sequence: &str) {
// 字符到虚拟键码的映射表
let mut key_map = HashMap::new();
key_map.insert('a', VK_A);
key_map.insert('s', VK_S);
key_map.insert('d', VK_D);
key_map.insert('f', VK_F);
key_map.insert('g', VK_G);
for ch in sequence.chars() {
if let Some(&vk) = key_map.get(&ch) {
send_key(vk);
}
}
}
fn main() {
// 按下并发送 "asdfg"
send_keys("asdfg");
}
[dependencies]
windows-sys="0.59.0"
winapi = { version = "0.3.8", features = ["winuser","libloaderapi"] }
anyhow_ext = "0.2"
[dependencies.windows]
version = "0.58.0"
features = [
"Win32_Foundation",
"Win32_UI_WindowsAndMessaging",
"Win32_UI_Input_KeyboardAndMouse",
"Win32_Security",
"Win32_System_Diagnostics",
"Win32_System_Threading",
"Win32_Graphics_Gdi",
"Win32_System_LibraryLoader",
"Win32_UI_WindowsAndMessaging",
"Win32_System_Diagnostics_Debug",
]