sendkeys_rs/
lib.rs

1/// Send press and release keystroke for the given `VIRTUAL_KEY` provided
2///
3#[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    }}; // ($($key:ident),*) => {{
34        //     todo!("Implement multiple keystrokes");
35        // }};
36        // ($(($modifier:ident,$key:ident)),*) => {{
37        //     todo!("Implement keystrokes with modifier");
38        // }};
39        // ($(($modifier:ident,$key:ident)),*) => {{
40        //     todo!("Implement keystrokes with multiple modifiers");
41        // }};
42}
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}