Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pub struct SubclassedWndProc {
- old_wnd_proc: WNDPROC,
- config: Config
- }
- impl SubclassedWndProc {
- pub fn new(config: &Config) { //-> Self {
- let mut new_proc = SubclassedWndProc{ old_wnd_proc: None, config: *config };
- // Subclasses window and gets the old WndProc function location in memory
- let proc_location = unsafe { SetWindowLongA(&mut *config.h_hammer_hwnd, GWL_WNDPROC, wnd_proc as i32) } as isize;
- // convert old wndproc memory location to function pointer
- let old_wnd_proc = unsafe {
- mem::transmute::<isize, unsafe extern "system" fn(HWND, u32, usize, isize) -> LRESULT>(proc_location)
- };
- new_proc.old_wnd_proc = Some(old_wnd_proc);
- unsafe { G_SUBCLASSED_PROXY = mem::transmute::<Mutex<SubclassedWndProc>, G_SUBCLASSED_PROXY>(Mutex::new(new_proc)) };
- // G_SUBCLASSED_PROXY.set_value(new_proc);
- // new_proc
- }
- }
- #[no_mangle]
- #[allow(private_no_mangle_fns)]
- unsafe extern "system" fn wnd_proc(hwnd: HWND, message: u32, w_param: WPARAM, l_param: LPARAM) -> LRESULT {
- match message {
- // do stuff here
- }
- CallWindowProcA(G_SUBCLASSED_PROXY.lock().unwrap().old_wnd_proc, hwnd, message, w_param, l_param)
- }
- lazy_static! {
- pub static ref G_SUBCLASSED_PROXY: Mutex<SubclassedWndProc> = Mutex::new(SubclassedWndProc {
- old_wnd_proc: None,
- config: Config::default()
- });
- }
Add Comment
Please, Sign In to add comment