winapi-easy 0.3.0

A safe interface to various winapi functionality
Documentation
use std::io;

use num_enum::{
    FromPrimitive,
    IntoPrimitive,
};
use winapi_easy::input::hotkey::{
    GlobalHotkeySet,
    Modifier,
};
use winapi_easy::input::{
    GenericKey,
    VirtualKey,
};
use winapi_easy::ui::lock_workstation;
use winapi_easy::ui::window::{
    MonitorPower,
    WindowHandle,
    WindowShowState,
};

#[derive(FromPrimitive, IntoPrimitive, Copy, Clone, Debug)]
#[repr(u8)]
enum Action {
    MonitorOff,
    MonitorOffPlusLock,
    VolumeUp,
    VolumeDown,
    #[num_enum(catch_all)]
    Other(u8),
}

fn main() -> io::Result<()> {
    if let Some(console_window) = WindowHandle::get_console_window() {
        console_window.set_show_state(WindowShowState::Minimize)?;
    }
    let listener = |hotkey_id| -> io::Result<()> {
        let monitor_off = || -> io::Result<()> {
            let foreground_window = WindowHandle::get_foreground_window().unwrap();
            foreground_window.set_monitor_power(MonitorPower::Off)
        };
        match Action::from(hotkey_id) {
            Action::MonitorOffPlusLock => {
                lock_workstation()?;
                monitor_off()?;
            }
            Action::MonitorOff => {
                monitor_off()?;
            }
            Action::VolumeUp => {
                VirtualKey::VolumeUp.press()?;
                VirtualKey::VolumeUp.release()?;
            }
            Action::VolumeDown => {
                VirtualKey::VolumeDown.press()?;
                VirtualKey::VolumeDown.release()?;
            }
            Action::Other(_) => unreachable!(),
        }
        Ok(())
    };
    let mut hotkeys = GlobalHotkeySet::new();
    hotkeys.add_hotkey(
        Action::MonitorOff.into(),
        Modifier::Ctrl + Modifier::Shift + VirtualKey::Oem1,
    )?;
    hotkeys.add_hotkey(
        Action::MonitorOffPlusLock.into(),
        Modifier::Ctrl + Modifier::Alt + VirtualKey::Oem1,
    )?;
    hotkeys.add_hotkey(Action::VolumeUp.into(), Modifier::Win + VirtualKey::PgUp)?;
    hotkeys.add_hotkey(
        Action::VolumeDown.into(),
        Modifier::Win + VirtualKey::PgDown,
    )?;
    hotkeys.listen_for_hotkeys(listener)?;
    Ok(())
}