srikanth.enigma Ответов: 4

как получить системные настройки dpi в консольном приложении c#


Как получить системные настройки dpi в консольном приложении c#. Независимо от того, является ли dpi 90 или 120 или какой-то другой пользовательской настройкой.

4 Ответов

Рейтинг:
30

markovl

Вы можете попробовать это:

using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
    float dpiX = graphics.DpiX;
    float dpiY = graphics.DpiY;
}


NB: вам понадобится ссылка на систему.Сборочный чертеж.


Alan N

Это гораздо аккуратнее, чем мой способ.

johannesnestler

Разве ОП не сказал "консольное приложение"? - [Edit] ах, извините, что вы упомянули ссылку на систему.Рисование

Kuan Bartel

Это не работает. В системе, использующей 120 точек на дюйм, это возвращает 96.

Рейтинг:
2

Alan N

Это значение хранится в реестре

Для 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"));
}

Алан.


Рейтинг:
1

johannesnestler

Попробовать это:

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();
        }
    }
}


Никаких дополнительных ссылок не требуется. Но если это лучше для импорта библиотека user32 и gdi32 dll файлы? Я не знаю - решения Маркова и Алана Н выглядят более элегантно...


Рейтинг:
0

Marcelo Caparoz (OctaneFX)

Небольшая адаптация

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]);


Выход: 96