Skip to content

Instantly share code, notes, and snippets.

@daniel-abramov
Created December 28, 2016 13:56
Show Gist options
  • Save daniel-abramov/5a460d9ca02948f1d2bfa53100c941da to your computer and use it in GitHub Desktop.
Save daniel-abramov/5a460d9ca02948f1d2bfa53100c941da to your computer and use it in GitHub Desktop.
Convenient Rust wrappers for a couple WinAPI calls
pub fn enumerate_windows<F>(mut callback: F)
where F: FnMut(HWND) -> bool
{
let mut trait_obj: &mut FnMut(HWND) -> bool = &mut callback;
let closure_pointer_pointer: *mut c_void = unsafe { mem::transmute(&mut trait_obj) };
let lparam = closure_pointer_pointer as LPARAM;
unsafe { EnumWindows(Some(enumerate_callback), lparam) };
}
pub fn enumerate_child_windows<F>(hwnd: HWND, mut callback: F)
where F: FnMut(HWND) -> bool
{
let mut trait_obj: &mut FnMut(HWND) -> bool = &mut callback;
let closure_pointer_pointer: *mut c_void = unsafe { mem::transmute(&mut trait_obj) };
let lparam = closure_pointer_pointer as LPARAM;
unsafe { EnumChildWindows(hwnd, Some(enumerate_callback), lparam) };
}
unsafe extern "system" fn enumerate_callback(hwnd: HWND, lparam: LPARAM) -> BOOL {
let closure: &mut &mut FnMut(HWND) -> bool = mem::transmute(lparam as *mut c_void);
if closure(hwnd) { TRUE } else { FALSE }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment