winsafe\user\handles/
hhook.rs

1#![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	/// Handle to a
11	/// [hook](https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types#hhook).
12}
13
14impl HHOOK {
15	/// [`SetWindowsHookEx`](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexw)
16	/// function.
17	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	/// [`UnhookWindowsHookEx`](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-unhookwindowshookex)
35	/// function.
36	///
37	/// After calling this method, the handle will be invalidated and further
38	/// operations will fail with
39	/// [`ERROR::INVALID_HANDLE`](crate::co::ERROR::INVALID_HANDLE) error code.
40	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}