#![allow(non_snake_case)]
use crate::co;
use crate::decl::*;
use crate::kernel::privs::*;
use crate::prelude::*;
use crate::user::{callbacks, ffi, iterators::*, privs::*};
#[must_use]
pub fn AdjustWindowRectEx(
rc: RECT,
style: co::WS,
has_menu: bool,
ex_style: co::WS_EX,
) -> SysResult<RECT> {
let mut buf = rc;
BoolRet(unsafe {
ffi::AdjustWindowRectEx(pvoid(&mut buf), style.raw(), has_menu as _, ex_style.raw())
})
.to_sysresult()
.map(|_| buf)
}
#[must_use]
pub fn AdjustWindowRectExForDpi(
rc: RECT,
style: co::WS,
has_menu: bool,
ex_style: co::WS_EX,
dpi: u32,
) -> SysResult<RECT> {
let mut buf = rc;
BoolRet(unsafe {
ffi::AdjustWindowRectExForDpi(
pvoid(&mut buf),
style.raw(),
has_menu as _,
ex_style.raw(),
dpi,
)
})
.to_sysresult()
.map(|_| buf)
}
pub fn AllowSetForegroundWindow(process_id: Option<u32>) -> SysResult<()> {
BoolRet(unsafe { ffi::AllowSetForegroundWindow(process_id.unwrap_or(ASFW_ANY)) }).to_sysresult()
}
#[must_use]
pub fn AnyPopup() -> bool {
unsafe { ffi::AnyPopup() != 0 }
}
pub fn AttachThreadInput(attach_id: u32, attach_to_id: u32, do_attach: bool) -> SysResult<()> {
BoolRet(unsafe { ffi::AttachThreadInput(attach_id, attach_to_id, do_attach as _) })
.to_sysresult()
}
pub fn BlockInput(block_it: bool) -> bool {
unsafe { ffi::BlockInput(block_it as _) != 0 }
}
pub unsafe fn BroadcastSystemMessage<M: MsgSend>(
flags: co::BSF,
info: co::BSM,
msg: M,
) -> SysResult<co::BSM> {
let mut msg = msg;
let wm_any = msg.as_generic_wm();
let mut info_ret = info;
if {
unsafe {
ffi::BroadcastSystemMessageW(
flags.raw(),
info_ret.as_mut(),
wm_any.msg_id.raw(),
wm_any.wparam,
wm_any.lparam,
)
}
} > 0
{
Ok(info_ret)
} else {
Err(GetLastError())
}
}
pub fn CallNextHookEx(code: co::WH, wparam: usize, lparam: isize) -> isize {
unsafe { ffi::CallNextHookEx(std::ptr::null_mut(), code.raw(), wparam, lparam) }
}
pub fn ChangeDisplaySettings(
dev_mode: Option<&mut DEVMODE>,
flags: co::CDS,
) -> Result<co::DISP_CHANGE, co::DISP_CHANGE> {
let ret = unsafe { ffi::ChangeDisplaySettingsW(pvoid_or_null(dev_mode), flags.raw()) };
unsafe {
if ret < 0 {
Err(co::DISP_CHANGE::from_raw(ret))
} else {
Ok(co::DISP_CHANGE::from_raw(ret))
}
}
}
pub fn ChangeDisplaySettingsEx(
device_name: Option<&str>,
dev_mode: Option<&mut DEVMODE>,
flags: co::CDS,
) -> Result<co::DISP_CHANGE, co::DISP_CHANGE> {
let ret = unsafe {
ffi::ChangeDisplaySettingsExW(
WString::from_opt_str(device_name).as_ptr(),
pvoid_or_null(dev_mode),
std::ptr::null_mut(),
flags.raw(),
std::ptr::null_mut(),
)
};
unsafe {
if ret < 0 {
Err(co::DISP_CHANGE::from_raw(ret))
} else {
Ok(co::DISP_CHANGE::from_raw(ret))
}
}
}
pub fn ChooseColor(cc: &mut CHOOSECOLOR) -> Result<bool, co::CDERR> {
match unsafe { ffi::ChooseColorW(pvoid(cc)) } {
0 => match CommDlgExtendedError() {
co::CDERR::NoValue => Ok(false),
err => Err(err),
},
_ => Ok(true),
}
}
pub fn ClipCursor(rc: Option<&RECT>) -> SysResult<()> {
BoolRet(unsafe { ffi::ClipCursor(pcvoid_or_null(rc)) }).to_sysresult()
}
#[must_use]
pub fn CommDlgExtendedError() -> co::CDERR {
unsafe { co::CDERR::from_raw(ffi::CommDlgExtendedError()) }
}
pub unsafe fn DispatchMessage(msg: &MSG) -> isize {
unsafe { ffi::DispatchMessageW(pcvoid(msg)) }
}
pub fn EndMenu() -> SysResult<()> {
BoolRet(unsafe { ffi::EndMenu() }).to_sysresult()
}
#[must_use]
pub fn EnumDisplayDevices(
device_name: Option<&str>,
flags: Option<co::EDD>,
) -> impl Iterator<Item = SysResult<&'_ DISPLAY_DEVICE>> {
EnumdisplaydevicesIter::new(device_name, flags)
}
pub fn EnumDisplaySettings(
device_name: Option<&str>,
mode_num: GmidxEnum,
dev_mode: &mut DEVMODE,
) -> SysResult<bool> {
match unsafe {
ffi::EnumDisplaySettingsW(
WString::from_opt_str(device_name).as_ptr(),
mode_num.into(),
pvoid(dev_mode),
)
} {
0 => match GetLastError() {
co::ERROR::PROC_NOT_FOUND => Ok(false), err => Err(err),
},
_ => Ok(true),
}
}
pub fn EnumDisplaySettingsEx(
device_name: Option<&str>,
mode_num: GmidxEnum,
dev_mode: &mut DEVMODE,
flags: co::EDS,
) -> SysResult<bool> {
match unsafe {
ffi::EnumDisplaySettingsExW(
WString::from_opt_str(device_name).as_ptr(),
mode_num.into(),
pvoid(dev_mode),
flags.raw(),
)
} {
0 => match GetLastError() {
co::ERROR::PROC_NOT_FOUND => Ok(false), err => Err(err),
},
_ => Ok(true),
}
}
pub fn EnumThreadWindows<F>(thread_id: u32, func: F) -> SysResult<()>
where
F: FnMut(HWND) -> bool,
{
BoolRet(unsafe {
ffi::EnumThreadWindows(thread_id, callbacks::func_enum_thread_wnd::<F> as _, pcvoid(&func))
})
.to_sysresult()
}
pub fn EnumWindows<F>(func: F) -> SysResult<()>
where
F: FnMut(HWND) -> bool,
{
BoolRet(unsafe {
ffi::EnumWindows(callbacks::func_enum_windows::<F> as _, &func as *const _ as _)
})
.to_sysresult()
}
pub fn ExitWindowsEx(flags: co::EWX, reason: co::SHTDN_REASON) -> SysResult<()> {
BoolRet(unsafe { ffi::ExitWindowsEx(flags.raw(), reason.raw()) }).to_sysresult()
}
pub fn FlashWindowEx(fwi: &FLASHWINFO) -> u32 {
unsafe { ffi::FlashWindowEx(pcvoid(fwi)) as _ }
}
#[must_use]
pub fn GetAsyncKeyState(virt_key: co::VK) -> bool {
unsafe { (ffi::GetAsyncKeyState(virt_key.raw() as _) as u16) & 0x8000 != 0 }
}
#[must_use]
pub fn GetCaretBlinkTime() -> SysResult<u32> {
match unsafe { ffi::GetCaretBlinkTime() } {
INFINITE => Err(GetLastError()),
n => Ok(n),
}
}
#[must_use]
pub fn GetCaretPos() -> SysResult<POINT> {
let mut pt = POINT::default();
BoolRet(unsafe { ffi::GetCaretPos(pvoid(&mut pt)) })
.to_sysresult()
.map(|_| pt)
}
#[must_use]
pub fn GetClipCursor() -> SysResult<RECT> {
let mut rc = RECT::default();
BoolRet(unsafe { ffi::GetClipCursor(pvoid(&mut rc)) })
.to_sysresult()
.map(|_| rc)
}
pub fn GetCursorInfo(ci: &mut CURSORINFO) -> SysResult<()> {
BoolRet(unsafe { ffi::GetCursorInfo(pvoid(ci)) }).to_sysresult()
}
#[must_use]
pub fn GetCursorPos() -> SysResult<POINT> {
let mut pt = POINT::default();
BoolRet(unsafe { ffi::GetCursorPos(pvoid(&mut pt)) })
.to_sysresult()
.map(|_| pt)
}
#[must_use]
pub fn GetDialogBaseUnits() -> i32 {
unsafe { ffi::GetDialogBaseUnits() }
}
#[must_use]
pub fn GetDoubleClickTime() -> u32 {
unsafe { ffi::GetDoubleClickTime() }
}
#[must_use]
pub fn GetGUIThreadInfo(thread_id: u32) -> SysResult<GUITHREADINFO> {
let mut gti = GUITHREADINFO::default();
BoolRet(unsafe { ffi::GetGUIThreadInfo(thread_id, pvoid(&mut gti)) })
.to_sysresult()
.map(|_| gti)
}
#[must_use]
pub fn GetLastInputInfo() -> SysResult<LASTINPUTINFO> {
let mut lii = LASTINPUTINFO::default();
BoolRet(unsafe { ffi::GetLastInputInfo(pvoid(&mut lii)) })
.to_sysresult()
.map(|_| lii)
}
#[must_use]
pub fn GetPhysicalCursorPos() -> SysResult<POINT> {
let mut pt = POINT::default();
BoolRet(unsafe { ffi::GetPhysicalCursorPos(pvoid(&mut pt)) })
.to_sysresult()
.map(|_| pt)
}
pub fn GetMessage(
msg: &mut MSG,
hwnd: Option<&HWND>,
msg_filter_min: u32,
msg_filter_max: u32,
) -> SysResult<bool> {
match unsafe {
ffi::GetMessageW(
pvoid(msg),
hwnd.map_or(std::ptr::null_mut(), |h| h.ptr()),
msg_filter_min,
msg_filter_max,
)
} {
-1 => Err(GetLastError()),
0 => Ok(false),
_ => Ok(true),
}
}
#[must_use]
pub fn GetMenuCheckMarkDimensions() -> SIZE {
SIZE::from(unsafe { ffi::GetMenuCheckMarkDimensions() })
}
#[must_use]
pub fn GetMessagePos() -> POINT {
POINT::from(unsafe { ffi::GetMessagePos() })
}
#[must_use]
pub fn GetProcessDefaultLayout() -> SysResult<co::LAYOUT> {
let mut dl = co::LAYOUT::default();
unsafe {
BoolRet(ffi::GetProcessDefaultLayout(dl.as_mut()))
.to_sysresult()
.map(|_| dl)
}
}
#[must_use]
pub fn GetQueueStatus(flags: co::QS) -> u32 {
unsafe { ffi::GetQueueStatus(flags.raw()) }
}
#[must_use]
pub fn GetSysColor(index: co::COLOR) -> COLORREF {
unsafe { COLORREF::from_raw(ffi::GetSysColor(index.raw())) }
}
#[must_use]
pub fn GetSystemMetrics(index: co::SM) -> i32 {
unsafe { ffi::GetSystemMetrics(index.raw()) }
}
#[must_use]
pub fn GetSystemMetricsForDpi(index: co::SM, dpi: u32) -> SysResult<i32> {
match unsafe { ffi::GetSystemMetricsForDpi(index.raw(), dpi) } {
0 => match GetLastError() {
co::ERROR::SUCCESS => Ok(0), err => Err(err),
},
val => Ok(val),
}
}
#[must_use]
pub fn GetThreadDpiHostingBehavior() -> co::DPI_HOSTING_BEHAVIOR {
unsafe { co::DPI_HOSTING_BEHAVIOR::from_raw(ffi::GetThreadDpiHostingBehavior()) }
}
#[must_use]
pub fn InSendMessage() -> bool {
unsafe { ffi::InSendMessage() != 0 }
}
#[must_use]
pub fn InflateRect(rc: RECT, dx: i32, dy: i32) -> SysResult<RECT> {
let mut buf = rc;
BoolRet(unsafe { ffi::InflateRect(pvoid(&mut buf), dx, dy) })
.to_sysresult()
.map(|_| buf)
}
#[cfg(target_pointer_width = "64")]
#[must_use]
pub fn InSendMessageEx() -> co::ISMEX {
unsafe { co::ISMEX::from_raw(ffi::InSendMessageEx()) }
}
#[must_use]
pub fn IntersectRect(src1: RECT, src2: RECT) -> SysResult<RECT> {
let mut dest = RECT::default();
BoolRet(unsafe { ffi::IntersectRect(pvoid(&mut dest), pcvoid(&src1), pcvoid(&src2)) })
.to_sysresult()
.map(|_| dest)
}
pub fn IsGUIThread(convert_to_gui_thread: bool) -> SysResult<bool> {
let r = unsafe { ffi::IsGUIThread(convert_to_gui_thread as _) };
if convert_to_gui_thread {
match r {
0 => Ok(false),
1 => Ok(true),
err => Err(unsafe { co::ERROR::from_raw(err as _) }),
}
} else {
Ok(r != 0)
}
}
#[must_use]
pub fn IsRectEmpty(rc: RECT) -> bool {
unsafe { ffi::IsRectEmpty(pcvoid(&rc)) != 0 }
}
#[must_use]
pub fn IsWow64Message() -> bool {
return unsafe { ffi::IsWow64Message() != 0 };
}
pub fn LockSetForegroundWindow(lock_code: co::LSFW) -> SysResult<()> {
BoolRet(unsafe { ffi::LockSetForegroundWindow(lock_code.raw()) }).to_sysresult()
}
pub fn LockWorkStation() -> SysResult<()> {
BoolRet(unsafe { ffi::LockWorkStation() }).to_sysresult()
}
pub fn MessageBeep(sound_type: co::MBP) -> SysResult<()> {
BoolRet(unsafe { ffi::MessageBeep(sound_type.raw()) }).to_sysresult()
}
#[must_use]
pub fn OffsetRect(rc: RECT, dx: i32, dy: i32) -> SysResult<RECT> {
let mut buf = rc;
BoolRet(unsafe { ffi::OffsetRect(pvoid(&mut buf), dx, dy) })
.to_sysresult()
.map(|_| buf)
}
pub fn PeekMessage(
msg: &mut MSG,
hwnd: Option<&HWND>,
msg_filter_min: u32,
msg_filter_max: u32,
remove_msg: co::PM,
) -> bool {
unsafe {
ffi::PeekMessageW(
pvoid(msg),
hwnd.map_or(std::ptr::null_mut(), |h| h.ptr()),
msg_filter_min,
msg_filter_max,
remove_msg.raw(),
) != 0
}
}
pub fn PostQuitMessage(exit_code: i32) {
unsafe { ffi::PostQuitMessage(exit_code) }
}
pub unsafe fn PostThreadMessage<M>(thread_id: u32, msg: M) -> SysResult<()>
where
M: MsgSend + Send + Copy + 'static,
{
let mut msg = msg;
let wm_any = msg.as_generic_wm();
BoolRet(unsafe {
ffi::PostThreadMessageW(thread_id, wm_any.msg_id.raw(), wm_any.wparam, wm_any.lparam)
})
.to_sysresult()
}
#[must_use]
pub fn PtInRect(rc: RECT, pt: POINT) -> bool {
unsafe { ffi::PtInRect(pcvoid(&rc), pt.into()) != 0 }
}
pub unsafe fn RegisterClassEx(wcx: &WNDCLASSEX) -> SysResult<ATOM> {
match unsafe { ffi::RegisterClassExW(pcvoid(wcx)) } {
0 => Err(GetLastError()),
atom => Ok(unsafe { ATOM::from_raw(atom) }),
}
}
#[must_use]
pub fn RegisterWindowMessage(s: &str) -> SysResult<u32> {
match unsafe { ffi::RegisterWindowMessageW(WString::from_str(s).as_ptr()) } {
0 => Err(GetLastError()),
id => Ok(id),
}
}
pub fn SendInput(inputs: &[HwKbMouse]) -> SysResult<u32> {
let objs = inputs
.iter()
.map(|ipt| INPUT::from_event(*ipt))
.collect::<Vec<_>>();
match unsafe {
ffi::SendInput(objs.len() as _, vec_ptr(&objs) as _, std::mem::size_of::<INPUT>() as _)
} {
0 => Err(GetLastError()),
n => Ok(n),
}
}
pub fn SetCaretBlinkTime(milliseconds: u32) -> SysResult<()> {
BoolRet(unsafe { ffi::SetCaretBlinkTime(milliseconds) }).to_sysresult()
}
pub fn SetCaretPos(x: i32, y: i32) -> SysResult<()> {
BoolRet(unsafe { ffi::SetCaretPos(x, y) }).to_sysresult()
}
pub fn SetCursorPos(x: i32, y: i32) -> SysResult<()> {
BoolRet(unsafe { ffi::SetCursorPos(x, y) }).to_sysresult()
}
#[must_use]
pub fn SetDoubleClickTime(ms: u32) -> SysResult<()> {
BoolRet(unsafe { ffi::SetDoubleClickTime(ms) }).to_sysresult()
}
pub fn SetPhysicalCursorPos(x: i32, y: i32) -> SysResult<()> {
BoolRet(unsafe { ffi::SetPhysicalCursorPos(x, y) }).to_sysresult()
}
pub fn SetProcessDefaultLayout(layout: co::LAYOUT) -> SysResult<()> {
BoolRet(unsafe { ffi::SetProcessDefaultLayout(layout.raw()) }).to_sysresult()
}
pub fn SetProcessDPIAware() -> SysResult<()> {
BoolRet(unsafe { ffi::SetProcessDPIAware() }).to_sysresult()
}
pub fn SetSysColors(elements_and_colors: &[(co::COLOR, COLORREF)]) -> SysResult<()> {
let (elems, colors): (Vec<_>, Vec<_>) = elements_and_colors
.iter()
.map(|ec| (ec.0.raw(), ec.1.raw()))
.unzip();
BoolRet(unsafe {
ffi::SetSysColors(elements_and_colors.len() as _, elems.as_ptr(), colors.as_ptr())
})
.to_sysresult()
}
pub fn SetThreadDpiHostingBehavior(value: co::DPI_HOSTING_BEHAVIOR) -> co::DPI_HOSTING_BEHAVIOR {
unsafe { co::DPI_HOSTING_BEHAVIOR::from_raw(ffi::SetThreadDpiHostingBehavior(value.raw())) }
}
pub fn ShowCursor(show: bool) -> i32 {
unsafe { ffi::ShowCursor(show as _) }
}
pub fn SoundSentry() -> bool {
unsafe { ffi::SoundSentry() != 0 }
}
#[must_use]
pub fn SubtractRect(src1: RECT, src2: RECT) -> SysResult<RECT> {
let mut dest = RECT::default();
BoolRet(unsafe { ffi::SubtractRect(pvoid(&mut dest), pcvoid(&src1), pcvoid(&src2)) })
.to_sysresult()
.map(|_| dest)
}
pub fn SwapMouseButton(swap: bool) -> bool {
unsafe { ffi::SwapMouseButton(swap as _) != 0 }
}
pub unsafe fn SystemParametersInfo<T>(
action: co::SPI,
ui_param: u32,
pv_param: &mut T,
win_ini: co::SPIF,
) -> SysResult<()> {
BoolRet(unsafe {
ffi::SystemParametersInfoW(action.raw(), ui_param, pvoid(pv_param), win_ini.raw())
})
.to_sysresult()
}
pub fn TrackMouseEvent(tme: &mut TRACKMOUSEEVENT) -> SysResult<()> {
BoolRet(unsafe { ffi::TrackMouseEvent(pvoid(tme)) }).to_sysresult()
}
pub fn TranslateMessage(msg: &MSG) -> bool {
unsafe { ffi::TranslateMessage(pcvoid(msg)) != 0 }
}
#[must_use]
pub fn UnionRect(src1: RECT, src2: RECT) -> SysResult<RECT> {
let mut dest = RECT::default();
BoolRet(unsafe { ffi::UnionRect(pvoid(&mut dest), pcvoid(&src1), pcvoid(&src2)) })
.to_sysresult()
.map(|_| dest)
}
pub fn UnregisterClass(class_name: AtomStr, hinst: &HINSTANCE) -> SysResult<()> {
BoolRet(unsafe { ffi::UnregisterClassW(class_name.as_ptr(), hinst.ptr()) }).to_sysresult()
}
pub fn WaitMessage() -> SysResult<()> {
BoolRet(unsafe { ffi::WaitMessage() }).to_sysresult()
}