move some stuff
key names will finally be correct
This commit is contained in:
parent
9e78b067f5
commit
8bba874cd6
|
@ -1,4 +1,7 @@
|
||||||
use winapi::um::winuser::KBDLLHOOKSTRUCT;
|
use std::ffi::OsString;
|
||||||
|
|
||||||
|
use winapi::um::winuser::{GetKeyNameTextW, KBDLLHOOKSTRUCT};
|
||||||
|
use wio::wide::FromWide;
|
||||||
|
|
||||||
pub struct KeyState {
|
pub struct KeyState {
|
||||||
pub kbdllstruct: KBDLLHOOKSTRUCT,
|
pub kbdllstruct: KBDLLHOOKSTRUCT,
|
||||||
|
@ -40,4 +43,15 @@ impl KeyState {
|
||||||
pub fn is_aux_key(&self) -> bool {
|
pub fn is_aux_key(&self) -> bool {
|
||||||
matches!(self.kbdllstruct.vkCode, 160 | 161 | 162 | 163 | 91)
|
matches!(self.kbdllstruct.vkCode, 160 | 161 | 162 | 163 | 91)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn name(&self) -> String {
|
||||||
|
unsafe {
|
||||||
|
let mut out = [0_u16; 128];
|
||||||
|
GetKeyNameTextW((self.kbdllstruct.scanCode << 16 | 1 << 24 /*this distinguishes special keys by setting a flag. yes only microsoft thinks that input and flags in 1 param is a good idea*/) as i32, (&mut out).as_mut_ptr(), 128);
|
||||||
|
let null_pos = out.iter().position(|x| *x == b'\0' as u16).unwrap_or_else(|| out.len());
|
||||||
|
//use to_string_lossy to avoid unicode checks for better performance. if the windows api screws up thats not my fault :P
|
||||||
|
OsString::from_wide(&out[..null_pos]).to_str().unwrap().to_owned()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
15
src/lib.rs
15
src/lib.rs
|
@ -9,20 +9,5 @@ clippy::cast_lossless, clippy::cast_possible_wrap, //lossy casts are required to
|
||||||
)]
|
)]
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
use winapi::um::winuser::GetKeyNameTextW;
|
|
||||||
use std::ffi::OsString;
|
|
||||||
use wio::wide::FromWide;
|
|
||||||
|
|
||||||
pub mod logging;
|
pub mod logging;
|
||||||
pub mod key;
|
pub mod key;
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub fn scan_code_to_key_name(scan_code: u32) -> String {
|
|
||||||
unsafe {
|
|
||||||
let mut out = [0_u16; 128];
|
|
||||||
GetKeyNameTextW((scan_code << 16) as i32, (&mut out).as_mut_ptr(), 128);
|
|
||||||
let null_pos = out.iter().position(|x| *x == b'\0' as u16).unwrap_or_else(|| out.len());
|
|
||||||
//use to_string_lossy to avoid unicode checks for better performance. if the windows api screws up thats not my fault :P
|
|
||||||
OsString::from_wide(&out[..null_pos]).to_string_lossy().into()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
use crate::logging::loggers::{ConsoleLogger, FileLogger};
|
use crate::logging::loggers::{ConsoleLogger, FileLogger};
|
||||||
use crate::scan_code_to_key_name;
|
|
||||||
use crate::key::keystate::KeyState;
|
use crate::key::keystate::KeyState;
|
||||||
|
|
||||||
pub trait Logger: Sync {
|
pub trait Logger: Sync {
|
||||||
|
@ -16,12 +15,12 @@ pub fn get_logger(name: &str) -> Box<dyn Logger> {
|
||||||
impl dyn Logger {
|
impl dyn Logger {
|
||||||
pub fn default_format(key: &KeyState) -> String {
|
pub fn default_format(key: &KeyState) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{} >> {}{}{} >> {}\n",
|
"{} >> {}{}{} >> {}",
|
||||||
key.kbdllstruct.vkCode,
|
key.kbdllstruct.vkCode,
|
||||||
if key.win_down { "w" } else { "" },
|
if key.win_down { "w" } else { "" },
|
||||||
if key.ctrl_down { "c" } else { "" },
|
if key.ctrl_down { "c" } else { "" },
|
||||||
if key.shift_down { "s" } else { "" },
|
if key.shift_down { "s" } else { "" },
|
||||||
scan_code_to_key_name(key.kbdllstruct.scanCode)
|
key.name()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,6 @@ impl FileLogger {
|
||||||
|
|
||||||
impl Logger for FileLogger {
|
impl Logger for FileLogger {
|
||||||
fn log(&self, key: &KeyState) {
|
fn log(&self, key: &KeyState) {
|
||||||
self.file.lock().unwrap().write_all(Logger::default_format(key).as_ref()).unwrap();
|
self.file.lock().unwrap().write_all(format!("{}\n", Logger::default_format(key)).as_ref()).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue