The process is running under DPI virtualization. So we should apply the DPI aware manifest option to stop DPI virtualization
[DllImport("user32.dll", SetLastError=true)] static extern bool SetProcessDPIAware();
Then
public enum SystemMetric { VirtualScreenWidth = 78, // CXVIRTUALSCREEN 0x0000004E VirtualScreenHeight = 79, // CYVIRTUALSCREEN 0x0000004F } [DllImport("user32.dll")] public static extern int GetSystemMetrics(SystemMetric metric); public static Size GetVirtualDisplaySize() { var width = GetSystemMetrics(SystemMetric.VirtualScreenWidth); var height = GetSystemMetrics(SystemMetric.VirtualScreenHeight); return new Size(width, height); }
References
https://stackoverflow.com/questions/28339257/getsystemmetrics-and-tscreen-returns-wrong-value
https://www.pinvoke.net/default.aspx/user32/SetProcessDPIAware.html
https://stackoverflow.com/questions/1317235/c-get-complete-desktop-size
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setprocessdpiaware