winapi_easy/ui/
desktop.rs

1use 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}