hookmap-core 0.2.1

Global hooks and input simulation fo keyboard and mouse.
Documentation
use crate::button::Button;

use windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY;

pub(super) const fn into_button(vkcode: VIRTUAL_KEY) -> Option<Button> {
    use windows::Win32::UI::Input::KeyboardAndMouse::*;
    use Button::*;

    Some(match vkcode {
        VK_LBUTTON => LeftButton,
        VK_RBUTTON => RightButton,
        VK_MBUTTON => MiddleButton,
        VK_XBUTTON1 => SideButton1,
        VK_XBUTTON2 => SideButton2,

        #[cfg(feature = "us-keyboard-layout")]
        VK_OEM_3 => Tilde,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_AUTO => HankakuZenkaku,

        VK_1 => Key1,
        VK_2 => Key2,
        VK_3 => Key3,
        VK_4 => Key4,
        VK_5 => Key5,
        VK_6 => Key6,
        VK_7 => Key7,
        VK_8 => Key8,
        VK_9 => Key9,
        VK_0 => Key0,
        VK_OEM_MINUS => Minus,

        #[cfg(feature = "us-keyboard-layout")]
        VK_OEM_PLUS => Equal,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_7 => Hat,

        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_5 => Yen,

        VK_BACK => Backspace,
        VK_TAB => Tab,
        VK_Q => Q,
        VK_W => W,
        VK_E => E,
        VK_R => R,
        VK_T => T,
        VK_Y => Y,
        VK_U => U,
        VK_I => I,
        VK_O => O,
        VK_P => P,

        #[cfg(feature = "us-keyboard-layout")]
        VK_OEM_4 => OpenSquareBracket,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_3 => At,

        #[cfg(feature = "us-keyboard-layout")]
        VK_OEM_6 => CloseSquareBracket,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_4 => OpenSquareBracket,

        #[cfg(feature = "us-keyboard-layout")]
        VK_CAPITAL => CapsLock,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_ATTN => Eisu,

        VK_A => A,
        VK_S => S,
        VK_D => D,
        VK_F => F,
        VK_G => G,
        VK_H => H,
        VK_J => J,
        VK_K => K,
        VK_L => L,

        #[cfg(feature = "us-keyboard-layout")]
        VK_OEM_1 => SemiColon,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_PLUS => SemiColon,

        #[cfg(feature = "us-keyboard-layout")]
        VK_OEM_7 => SingleQuote,
        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_1 => Colon,

        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_6 => CloseSquareBracket,

        VK_RETURN => Enter,
        VK_LSHIFT => LShift,
        VK_Z => Z,
        VK_X => X,
        VK_C => C,
        VK_V => V,
        VK_B => B,
        VK_N => N,
        VK_M => M,
        VK_OEM_COMMA => Comma,
        VK_OEM_PERIOD => Dot,
        VK_OEM_2 => Slash,

        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_102 => BackSlash,

        VK_RSHIFT => RShift,
        VK_LCONTROL => LCtrl,
        VK_LWIN => LSuper,
        VK_LMENU => LAlt,

        #[cfg(feature = "japanese-keyboard-layout")]
        VK_NONCONVERT => Muhenkan,

        VK_SPACE => Space,

        #[cfg(feature = "japanese-keyboard-layout")]
        VK_CONVERT => Henkan,

        #[cfg(feature = "japanese-keyboard-layout")]
        VK_OEM_COPY => KatakanaHiragana,

        VK_RMENU => RAlt,
        VK_RWIN => RSuper,
        VK_APPS => Application,
        VK_RCONTROL => RCtrl,
        VK_INSERT => Insert,
        VK_DELETE => Delete,
        VK_LEFT => LeftArrow,
        VK_HOME => Home,
        VK_END => End,
        VK_UP => UpArrow,
        VK_DOWN => DownArrow,
        VK_PRIOR => PageUp,
        VK_NEXT => PageDown,
        VK_RIGHT => RightArrow,
        VK_NUMPAD1 => Numpad1,
        VK_NUMPAD2 => Numpad2,
        VK_NUMPAD3 => Numpad3,
        VK_NUMPAD4 => Numpad4,
        VK_NUMPAD5 => Numpad5,
        VK_NUMPAD6 => Numpad6,
        VK_NUMPAD7 => Numpad7,
        VK_NUMPAD8 => Numpad8,
        VK_NUMPAD9 => Numpad9,
        VK_NUMPAD0 => Numpad0,
        VK_DECIMAL => NumpadDot,
        VK_DIVIDE => NumpadSlash,
        VK_MULTIPLY => NumpadAsterisk,
        VK_SUBTRACT => NumpadMinus,
        VK_ADD => NumpadPlus,
        VK_ESCAPE => Esc,
        VK_F1 => F1,
        VK_F2 => F2,
        VK_F3 => F3,
        VK_F4 => F4,
        VK_F5 => F5,
        VK_F6 => F6,
        VK_F7 => F7,
        VK_F8 => F8,
        VK_F9 => F9,
        VK_F10 => F10,
        VK_F11 => F11,
        VK_F12 => F12,
        VK_F13 => F13,
        VK_F14 => F14,
        VK_F15 => F15,
        VK_F16 => F16,
        VK_F17 => F17,
        VK_F18 => F18,
        VK_F19 => F19,
        VK_F20 => F20,
        VK_F21 => F21,
        VK_F22 => F22,
        VK_F23 => F23,
        VK_F24 => F24,
        VK_SNAPSHOT => PrintScreen,

        VK_VOLUME_MUTE => VolumeMute,
        VK_VOLUME_DOWN => VolumeDown,
        VK_VOLUME_UP => VolumeUp,
        VK_MEDIA_NEXT_TRACK => MediaNext,
        VK_MEDIA_PREV_TRACK => MediaPrevious,
        VK_MEDIA_STOP => MediaStop,
        VK_MEDIA_PLAY_PAUSE => MediaPlayPause,

        _ => return None,
    })
}

pub(super) const fn from_button(button: Button) -> VIRTUAL_KEY {
    use windows::Win32::UI::Input::KeyboardAndMouse::*;
    use Button::*;

    match button {
        LeftButton => VK_LBUTTON,
        RightButton => VK_RBUTTON,
        MiddleButton => VK_MBUTTON,
        SideButton1 => VK_XBUTTON1,
        SideButton2 => VK_XBUTTON2,

        #[cfg(feature = "us-keyboard-layout")]
        Tilde => VK_OEM_3,
        #[cfg(feature = "japanese-keyboard-layout")]
        HankakuZenkaku => VK_OEM_AUTO,

        Key1 => VK_1,
        Key2 => VK_2,
        Key3 => VK_3,
        Key4 => VK_4,
        Key5 => VK_5,
        Key6 => VK_6,
        Key7 => VK_7,
        Key8 => VK_8,
        Key9 => VK_9,
        Key0 => VK_0,
        Minus => VK_OEM_MINUS,

        #[cfg(feature = "us-keyboard-layout")]
        Equal => VK_OEM_PLUS,
        #[cfg(feature = "japanese-keyboard-layout")]
        Hat => VK_OEM_7,

        #[cfg(feature = "japanese-keyboard-layout")]
        Yen => VK_OEM_5,

        Backspace => VK_BACK,
        Tab => VK_TAB,
        Q => VK_Q,
        W => VK_W,
        E => VK_E,
        R => VK_R,
        T => VK_T,
        Y => VK_Y,
        U => VK_U,
        I => VK_I,
        O => VK_O,
        P => VK_P,

        #[cfg(feature = "us-keyboard-layout")]
        OpenSquareBracket => VK_OEM_4,
        #[cfg(feature = "japanese-keyboard-layout")]
        At => VK_OEM_3,

        #[cfg(feature = "us-keyboard-layout")]
        CloseSquareBracket => VK_OEM_6,
        #[cfg(feature = "japanese-keyboard-layout")]
        OpenSquareBracket => VK_OEM_4,

        #[cfg(feature = "us-keyboard-layout")]
        CapsLock => VK_CAPITAL,
        #[cfg(feature = "japanese-keyboard-layout")]
        Eisu => VK_OEM_ATTN,

        A => VK_A,
        S => VK_S,
        D => VK_D,
        F => VK_F,
        G => VK_G,
        H => VK_H,
        J => VK_J,
        K => VK_K,
        L => VK_L,

        #[cfg(feature = "us-keyboard-layout")]
        SemiColon => VK_OEM_1,
        #[cfg(feature = "japanese-keyboard-layout")]
        SemiColon => VK_OEM_PLUS,

        #[cfg(feature = "us-keyboard-layout")]
        SingleQuote => VK_OEM_7,
        #[cfg(feature = "japanese-keyboard-layout")]
        Colon => VK_OEM_1,

        #[cfg(feature = "japanese-keyboard-layout")]
        CloseSquareBracket => VK_OEM_6,

        Enter => VK_RETURN,
        LShift => VK_LSHIFT,
        Z => VK_Z,
        X => VK_X,
        C => VK_C,
        V => VK_V,
        B => VK_B,
        N => VK_N,
        M => VK_M,
        Comma => VK_OEM_COMMA,
        Dot => VK_OEM_PERIOD,
        Slash => VK_OEM_2,

        #[cfg(feature = "japanese-keyboard-layout")]
        BackSlash => VK_OEM_102,

        RShift => VK_RSHIFT,
        LCtrl => VK_LCONTROL,
        LSuper => VK_LWIN,
        LAlt => VK_LMENU,

        #[cfg(feature = "japanese-keyboard-layout")]
        Muhenkan => VK_NONCONVERT,

        Space => VK_SPACE,

        #[cfg(feature = "japanese-keyboard-layout")]
        Henkan => VK_CONVERT,

        #[cfg(feature = "japanese-keyboard-layout")]
        KatakanaHiragana => VK_OEM_COPY,

        RAlt => VK_RMENU,
        RSuper => VK_RWIN,
        Application => VK_APPS,
        RCtrl => VK_RCONTROL,
        Insert => VK_RCONTROL,
        Delete => VK_DELETE,
        LeftArrow => VK_LEFT,
        Home => VK_HOME,
        End => VK_END,
        UpArrow => VK_UP,
        DownArrow => VK_DOWN,
        PageUp => VK_PRIOR,
        PageDown => VK_NEXT,
        RightArrow => VK_RIGHT,
        Numpad1 => VK_NUMPAD1,
        Numpad2 => VK_NUMPAD2,
        Numpad3 => VK_NUMPAD3,
        Numpad4 => VK_NUMPAD4,
        Numpad5 => VK_NUMPAD5,
        Numpad6 => VK_NUMPAD6,
        Numpad7 => VK_NUMPAD7,
        Numpad8 => VK_NUMPAD8,
        Numpad9 => VK_NUMPAD9,
        Numpad0 => VK_NUMPAD0,
        NumpadDot => VK_DECIMAL,
        NumpadSlash => VK_DIVIDE,
        NumpadAsterisk => VK_MULTIPLY,
        NumpadMinus => VK_SUBTRACT,
        NumpadPlus => VK_ADD,
        Esc => VK_ESCAPE,
        F1 => VK_F1,
        F2 => VK_F2,
        F3 => VK_F3,
        F4 => VK_F4,
        F5 => VK_F5,
        F6 => VK_F6,
        F7 => VK_F7,
        F8 => VK_F8,
        F9 => VK_F9,
        F10 => VK_F10,
        F11 => VK_F11,
        F12 => VK_F12,
        F13 => VK_F13,
        F14 => VK_F14,
        F15 => VK_F15,
        F16 => VK_F16,
        F17 => VK_F17,
        F18 => VK_F18,
        F19 => VK_F19,
        F20 => VK_F20,
        F21 => VK_F21,
        F22 => VK_F22,
        F23 => VK_F23,
        F24 => VK_F24,
        PrintScreen => VK_SNAPSHOT,

        VolumeMute => VK_VOLUME_MUTE,
        VolumeDown => VK_VOLUME_DOWN,
        VolumeUp => VK_VOLUME_UP,
        MediaNext => VK_MEDIA_NEXT_TRACK,
        MediaPrevious => VK_MEDIA_PREV_TRACK,
        MediaStop => VK_MEDIA_STOP,
        MediaPlayPause => VK_MEDIA_PLAY_PAUSE,

        Shift | Ctrl | Alt | Super => unreachable!(),
    }
}