как получить системные настройки dpi в консольном приложении c#
Как получить системные настройки dpi в консольном приложении c#. Независимо от того, является ли dpi 90 или 120 или какой-то другой пользовательской настройкой.
Вы можете попробовать это:
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero)) { float dpiX = graphics.DpiX; float dpiY = graphics.DpiY; }
Это гораздо аккуратнее, чем мой способ.
Разве ОП не сказал "консольное приложение"? - [Edit] ах, извините, что вы упомянули ссылку на систему.Рисование
Это не работает. В системе, использующей 120 точек на дюйм, это возвращает 96.
Это значение хранится в реестре
Для XP это вHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI LogPixels
Вы можете создать графический объект из дескриптора окна консоли:
using (Graphics g = Graphics.FromHwnd(Process.GetCurrentProcess().MainWindowHandle)) { Console.WriteLine("X {0:F0}dpi, Y {1:F0}dpi", g.DpiX, g.DpiY); } using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\WindowsNT\CurrentVersion\FontDPI")) { Console.WriteLine(key.GetValue("LogPixels")); }
Попробовать это:
using System; using System.Runtime.InteropServices; namespace DPI { class Program { [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr hWnd); /// <summary> /// Logical pixels inch in X /// </summary> const int LOGPIXELSX = 88; /// <summary> /// Logical pixels inch in Y /// </summary> const int LOGPIXELSY = 90; static void Main(string[] args) { IntPtr hdc = GetDC(IntPtr.Zero); Console.WriteLine(GetDeviceCaps(hdc, LOGPIXELSX)); // or Console.WriteLine(GetDeviceCaps(hdc, LOGPIXELSY)); Console.ReadKey(); } } }
Небольшая адаптация
using System; using System.Drawing; namespace Helpers { public class DPI { public static float[] GetDpi() { using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero)) { float dpiX = graphics.DpiX; float dpiY = graphics.DpiY; float[] result = new float[] { dpiX = dpiX, dpiY = dpiY }; return result; } } } }
float[] Dpi = DPI.GetDpi(); Console.WriteLine(Dpi[0]);