#define WIN32_LEAN_AND_MEAN #include #include "geometry.h" #include "stream.h" /* vgpu_publish_geometry */ /* GetDpiForMonitor lives in Shcore.dll (per-monitor DPI awareness API). Loaded dynamically so * the binary does not hard-depend on it; absence degrades dpi to "unknown" (0). */ typedef HRESULT (WINAPI *GetDpiForMonitor_t)(HMONITOR, int /*MDT_*/, UINT*, UINT*); #define VGPU_MDT_EFFECTIVE_DPI 0 static UINT monitor_dpi(HMONITOR mon) { static GetDpiForMonitor_t fn = NULL; static int tried = 0; if (!tried) { HMODULE lib = LoadLibraryA("Shcore.dll"); if (lib) fn = (GetDpiForMonitor_t)(void*)GetProcAddress(lib, "GetDpiForMonitor"); tried = 1; } if (!fn || !mon) return 0u; UINT dx = 0, dy = 0; if (fn(mon, VGPU_MDT_EFFECTIVE_DPI, &dx, &dy) != S_OK || dx == 0u) return 0u; return dx; } static uint32_t monitor_refresh_mhz(HMONITOR mon) { MONITORINFOEXW mi; mi.cbSize = sizeof mi; if (!mon || !GetMonitorInfoW(mon, (MONITORINFO*)&mi)) return 0u; DEVMODEW dm; ZeroMemory(&dm, sizeof dm); dm.dmSize = sizeof dm; if (!EnumDisplaySettingsW(mi.szDevice, ENUM_CURRENT_SETTINGS, &dm)) return 0u; if (dm.dmDisplayFrequency <= 1u) /* 0/1 = hardware default, not a real rate */ return 0u; return (uint32_t)dm.dmDisplayFrequency * 1000u; /* whole Hz -> milli-Hz */ } void geometry_sample_and_publish(vgpu_ctx* ctx, int32_t cap_x, int32_t cap_y) { int32_t virt_x = (int32_t)GetSystemMetrics(SM_XVIRTUALSCREEN); int32_t virt_y = (int32_t)GetSystemMetrics(SM_YVIRTUALSCREEN); uint32_t virt_w = (uint32_t)GetSystemMetrics(SM_CXVIRTUALSCREEN); uint32_t virt_h = (uint32_t)GetSystemMetrics(SM_CYVIRTUALSCREEN); POINT origin = { cap_x, cap_y }; HMONITOR mon = MonitorFromPoint(origin, MONITOR_DEFAULTTOPRIMARY); uint32_t dpi = monitor_dpi(mon); uint32_t refresh = monitor_refresh_mhz(mon); vgpu_publish_geometry(&ctx->view, virt_x, virt_y, virt_w, virt_h, cap_x, cap_y, dpi, refresh); }