1#[macro_export]
4macro_rules! send_keys {
5 ($key:ident) => {{
6 use windows::Win32::UI::Input::KeyboardAndMouse::{
7 SendInput, INPUT, INPUT_0, INPUT_KEYBOARD, KEYBDINPUT, KEYEVENTF_KEYUP,
8 };
9 let mut input_list: Vec<INPUT> = Vec::new();
10 input_list.extend_from_slice(&[
11 INPUT {
12 r#type: INPUT_KEYBOARD,
13 Anonymous: INPUT_0 {
14 ki: KEYBDINPUT {
15 wVk: $key,
16 ..Default::default()
17 },
18 },
19 },
20 INPUT {
21 r#type: INPUT_KEYBOARD,
22 Anonymous: INPUT_0 {
23 ki: KEYBDINPUT {
24 wVk: $key,
25 dwFlags: KEYEVENTF_KEYUP,
26 ..Default::default()
27 },
28 },
29 },
30 ]);
31
32 unsafe { SendInput(input_list.as_slice(), std::mem::size_of::<INPUT>() as _) > 0 }
33 }}; }
43
44#[cfg(test)]
45mod tests {
46 use windows::Win32::UI::Input::KeyboardAndMouse::{VK_VOLUME_DOWN, VK_VOLUME_UP};
47
48 #[test]
49 fn volume_up() {
50 let result = send_keys!(VK_VOLUME_UP);
51 assert_eq!(result, true);
52 }
53
54 #[test]
55 fn volume_down() {
56 let result = send_keys!(VK_VOLUME_DOWN);
57 assert_eq!(result, true);
58 }
59}