#c_sharp #windows #net_40
Почти всегда рекомендуют использовать System.Windows.SystemParameters.PrimaryScreenWidth
И в обычных ситуациях он у меня показывает реальную ширину в 1920. Однако если я в
настройках Винды выберу увеличенный DPI, допустим не 100%, а 125%, то результатом System.Windows.SystemParameters.PrimaryScreenWidth
будет уже не 1920, а 1536.
В общем, я ищу, как добыть реальное разрешение экрана вне зависимости от DPI.
Необходимо для консольной программы.
Ответы
Ответ 1
Для WPF (PresentationCore.dll) под .NET 4.6.2+: var dpi = System.Windows.Media.VisualTreeHelper.GetDpi(new System.Windows.Controls.Control()); var screenRealWidth = SystemParameters.PrimaryScreenWidth * dpi.DpiScaleX; var screenRealHeight = SystemParameters.PrimaryScreenHeight * dpi.DpiScaleY; Для версий .NET ниже 4.6.2 несколько сложнее: var matrixTransform = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice; var screenRealWidth = SystemParameters.PrimaryScreenWidth * matrixTransform.M11; var screenRealHeight = SystemParameters.PrimaryScreenHeight * matrixTransform.M22; Где visual — любой визуальный элемент, но этот элемент должен быть обязательно загружен, т. е. код сработает только после того как произошло событие Loaded Для WinForms (System.Drawing.dll, System.Windows.Forms.dll): float dpiX, dpiY, dpiBase = 96; using (var g = new Control().CreateGraphics()) { dpiX = g.DpiX; dpiY = g.DpiY; } var screenRealWidth = SystemParameters.PrimaryScreenWidth * dpiX / dpiBase; var screenRealHeight = SystemParameters.PrimaryScreenHeight * dpiY / dpiBase; Впрочем, вам ничто не мешает подключить библиотеки WPF в WinForms или наоборот, а также любую из них в консольном приложении.Ответ 2
Помогло это решение: [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap { VERTRES = 10, DESKTOPVERTRES = 117, // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html } private float getScalingFactor() { Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); float ScreenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight; return ScreenScalingFactor; // 1.25 = 125% } float dpiBase = 96; var screenRealWidth = SystemParameters.PrimaryScreenWidth * (dpiBase * getScalingFactor()) / dpiBase; var screenRealHeight = SystemParameters.PrimaryScreenHeight * (dpiBase * getScalingFactor()) / dpiBase; Код на добычу DPI был взят отсюда https://stackoverflow.com/questions/5977445/how-to-get-windows-display-settings/21450169#21450169 Но там многие жалуются что он не у всех всегда верно срабатывает, так что наиболее верным такое решение считать нельзя.
Комментариев нет:
Отправить комментарий