From 52dcfd061488236b0fc77a8f59f232510d18cf55 Mon Sep 17 00:00:00 2001 From: Pariring Date: Thu, 3 Nov 2022 19:37:53 +0900 Subject: [PATCH] feat: start hook --- build.sh | 1 - src/lib.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 57d5971..108b861 100755 --- a/build.sh +++ b/build.sh @@ -8,7 +8,6 @@ mkdir -p out/i686 # x86_64 cargo build --release --target x86_64-unknown-linux-gnu # cargo build --release --target x86_64-apple-darwin -echo [Windows] cargo build --release --target x86_64-pc-windows-gnu diff --git a/src/lib.rs b/src/lib.rs index dd0d9aa..a22dab1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,65 @@ +use std::{ + ffi::{c_char, CString}, + ptr::null, + time::{SystemTime, UNIX_EPOCH}, +}; + extern crate skyhook; + +#[repr(C)] +pub enum NativeEventType { + KeyPressed, + KeyReleased, +} + +#[repr(C)] +pub struct NativeEvent { + pub time: usize, + pub event_type: NativeEventType, + pub key: u16, +} + +static mut CALLBACK: Option = None; + +fn send_callback(ev: NativeEvent) { + unsafe { + if let Some(cb) = CALLBACK { + cb(ev); + } + } +} + +fn get_time(time: SystemTime) -> usize { + time.duration_since(UNIX_EPOCH).unwrap().as_millis() as usize +} + +#[no_mangle] +pub extern "C" fn start_hook(callback: extern "C" fn(NativeEvent)) -> *const c_char { + unsafe { + CALLBACK = Some(callback); + } + + if let Err(e) = skyhook::run(move |event| { + let event = match event.data { + skyhook::types::EventData::KeyPress(key) => NativeEvent { + time: get_time(event.time), + event_type: NativeEventType::KeyPressed, + key, + }, + skyhook::types::EventData::KeyRelease(key) => NativeEvent { + time: get_time(event.time), + event_type: NativeEventType::KeyReleased, + key, + }, + }; + send_callback(event); + }) { + let cstr = CString::new(e.message).unwrap(); + return cstr.as_ptr(); + } + + null() +} + +#[no_mangle] +pub extern "C" fn stop_hook() {}