Hi,
I'm trying to use Rust along with the winapi = {version = "0.3", features = ["winuser"]}
crate in order to register a hotkey
I've got this following code setup
use std::{
ptr,
thread,
sync::{atomic::{AtomicBool, Ordering}, Arc},
};
use winapi::{
shared::minwindef::{LPARAM, WPARAM},
um::{winuser::{
RegisterHotKey, TranslateMessage, DispatchMessageW, PeekMessageW,
PM_REMOVE, MSG, MOD_WIN, MOD_NOREPEAT, WM_HOTKEY,
}, errhandlingapi::GetLastError},
};
fn register_global_hotkey(stop_flag: Arc<AtomicBool>) {
unsafe {
let registered = RegisterHotKey(
ptr::null_mut(),
1,
(MOD_WIN | MOD_NOREPEAT) as u32,
's' as u32,
);
if registered == 0{
println!("failed to register hotkey {}", GetLastError());
}
let mut msg = MSG {
hwnd: ptr::null_mut(),
message: 0,
wParam: 0,
lParam: 0,
time: 0,
pt: std::mem::zeroed(),
};
while !stop_flag.load(Ordering::Relaxed) {
let peek_value = PeekMessageW(&mut msg, ptr::null_mut(), 0, 0, PM_REMOVE);
if peek_value != 0 {
TranslateMessage(&msg);
DispatchMessageW(&msg);
if msg.message == WM_HOTKEY {
println!("Win + s pressed!");
}
}
println!("Peek value {} Message Value: {:?}",peek_value, msg.message);
}
}
}
fn main() {
let stop_flag = Arc::new(AtomicBool::new(false));
let hotkey_thread = thread::spawn({
let stop_flag = Arc::clone(&stop_flag);
move || {
register_global_hotkey(stop_flag);
}
});
hotkey_thread.join().unwrap();
return;
}
I'm not getting any errors but the output of
println!("Peek value {} Message Value: {}",peek_value, msg.message);
Is always
Peek value 0 Message Value: 0
Even if I'm pressing keys/clicking etc.
Does anyone have any idea what I have setup wrong here?
Thanks!