use std::ops::{Deref, DerefMut};
use windows_sys::Win32::{
Foundation::HWND,
UI::WindowsAndMessaging::{ACCEL, WINDOW_LONG_PTR_INDEX},
};
pub fn encode_wide<S: AsRef<std::ffi::OsStr>>(string: S) -> Vec<u16> {
std::os::windows::prelude::OsStrExt::encode_wide(string.as_ref())
.chain(std::iter::once(0))
.collect()
}
#[derive(Clone)]
#[repr(transparent)]
pub struct Accel(pub ACCEL);
impl std::fmt::Debug for Accel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ACCEL")
.field("key", &self.0.key)
.field("cmd", &self.0.cmd)
.field("fVirt", &self.0.fVirt)
.finish()
}
}
impl Deref for Accel {
type Target = ACCEL;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for Accel {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
pub fn get_instance_handle() -> windows_sys::Win32::Foundation::HMODULE {
extern "C" {
static __ImageBase: windows_sys::Win32::System::SystemServices::IMAGE_DOS_HEADER;
}
unsafe { &__ImageBase as *const _ as _ }
}
#[inline(always)]
pub unsafe fn get_window_long(hwnd: HWND, nindex: WINDOW_LONG_PTR_INDEX) -> isize {
#[cfg(target_pointer_width = "64")]
return unsafe { windows_sys::Win32::UI::WindowsAndMessaging::GetWindowLongPtrW(hwnd, nindex) };
#[cfg(target_pointer_width = "32")]
return unsafe {
windows_sys::Win32::UI::WindowsAndMessaging::GetWindowLongW(hwnd, nindex) as isize
};
}
#[inline(always)]
pub unsafe fn set_window_long(
hwnd: HWND,
nindex: WINDOW_LONG_PTR_INDEX,
dwnewlong: isize,
) -> isize {
#[cfg(target_pointer_width = "64")]
return unsafe {
windows_sys::Win32::UI::WindowsAndMessaging::SetWindowLongPtrW(hwnd, nindex, dwnewlong)
};
#[cfg(target_pointer_width = "32")]
return unsafe {
windows_sys::Win32::UI::WindowsAndMessaging::SetWindowLongW(hwnd, nindex, dwnewlong as i32)
as isize
};
}