winsafe\user\handles/
hhook.rs1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::kernel::privs::*;
6use crate::prelude::*;
7use crate::user::ffi;
8
9handle! { HHOOK;
10 }
13
14impl HHOOK {
15 pub fn SetWindowsHookEx(
18 hook_id: co::WH,
19 proc: HOOKPROC,
20 module: Option<&HINSTANCE>,
21 thread_id: Option<u32>,
22 ) -> SysResult<HHOOK> {
23 PtrRet(unsafe {
24 ffi::SetWindowsHookExW(
25 hook_id.raw(),
26 proc as _,
27 module.map_or(std::ptr::null_mut(), |h| h.ptr()),
28 thread_id.unwrap_or_default(),
29 )
30 })
31 .to_sysresult_handle()
32 }
33
34 pub fn UnhookWindowsHookEx(&mut self) -> SysResult<()> {
41 let ret = BoolRet(unsafe { ffi::UnhookWindowsHookEx(self.ptr()) }).to_sysresult();
42 *self = Self::INVALID;
43 ret
44 }
45}