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(())
}