winapi_easy/ui/
desktop.rs1use std::io;
2
3use windows::Win32::Graphics::Gdi::{
4 GetMonitorInfoW,
5 HMONITOR,
6 MONITOR_DEFAULTTOPRIMARY,
7 MONITORINFO,
8 MonitorFromWindow,
9};
10
11use super::Rectangle;
12use super::window::WindowHandle;
13use crate::internal::ReturnValue;
14
15#[derive(Clone, Copy, Eq, PartialEq, Debug)]
16pub struct MonitorHandle {
17 raw_handle: HMONITOR,
18}
19
20impl MonitorHandle {
21 pub fn from_window(window_handle: WindowHandle) -> Self {
22 let raw_handle =
23 unsafe { MonitorFromWindow(window_handle.into(), MONITOR_DEFAULTTOPRIMARY) };
24 Self { raw_handle }
25 }
26
27 pub fn info(self) -> io::Result<MonitorInfo> {
28 let mut raw_info = MONITORINFO {
29 cbSize: std::mem::size_of::<MONITORINFO>()
30 .try_into()
31 .unwrap_or_else(|_| unreachable!()),
32 ..Default::default()
33 };
34 unsafe { GetMonitorInfoW(self.raw_handle, &raw mut raw_info) }
35 .if_null_get_last_error_else_drop()?;
36 Ok(MonitorInfo {
37 monitor_area: raw_info.rcMonitor,
38 work_area: raw_info.rcWork,
39 })
40 }
41}
42
43impl From<MonitorHandle> for HMONITOR {
44 fn from(value: MonitorHandle) -> Self {
45 value.raw_handle
46 }
47}
48
49#[derive(Clone, Copy, Debug)]
50pub struct MonitorInfo {
51 pub monitor_area: Rectangle,
52 pub work_area: Rectangle,
53}