Управляет ли Aero параметрами DPI и размером экрана? Почему?

В моем приложении я получаю разрешение экрана с помощью этого кода:

SystemInformation.PrimaryMonitorSize

И я получаю DPI с этим кодом:

    using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero)))
    {
        dpiX = g.DpiX;
        dpiY = g.DpiY; 
    }

Это отлично работает в большинстве ситуаций. Но когда код запускается на компьютере с Vista с включенным Aero, и пользователь настроил монитор на использование высокого DPI, возвращаются странные результаты.

Допустим, пользователь настроил машину на работу с разрешением 1024 x 768 и имеет DPI 144, приведенный выше код вернет разрешение 683 x 512 и DPI 96.

Однако, если Aero отключен, результаты возвращаются, как я и ожидал. Что делает Aero и как я могу получить истинное разрешение и DPI?


person epotter    schedule 26.08.2009    source источник


Ответы (2)


Вам необходимо объявить ваше приложение как поддерживающее DPI либо в манифесте (предпочтительно), либо с помощью функции SetProcessDPIAware Win32 API. Поскольку многие приложения не написаны должным образом, Vista добавила «виртуализацию DPI», которая позволяет приложениям делать вид, что они работают со «стандартным» экраном с разрешением 96 точек на дюйм, а затем выполняет само масштабирование — DWM, будучи оконным менеджером компоновки, может это сделать. масштабирование. Если ваше приложение правильно обрабатывает переменный DPI, вы должны указать это явно.

Кстати, вам не следует возиться с HWND_DESKTOP (что и есть (HWND)0). Когда композитинг («Aero») выключен, он действительно представляет физический экран, поэтому, если вы получаете его DC и рисуете на нем, вы рисуете прямо в фреймбуфере. С композитным оконным менеджером это невозможно по определению. Я не уверен, влияет ли это на измерение DPI, но в любом случае лучше использовать DC для окна вашего приложения - это не повредит /

person Pavel Minaev    schedule 26.08.2009
comment
+1 Это точно. Microsoft отказалась от попыток умолять разработчиков заставить их приложения правильно работать при настройках dpi, отличных от 96 dpi. Вместо того, чтобы большинство приложений ломались, если пользователь выбирал высокое разрешение, разработчики теперь указали, что они поддерживают высокое разрешение. Пользователь по-прежнему может отключить масштабирование для каждой программы (щелкните правой кнопкой мыши, вкладка «Совместимость»). - person Ian Boyd; 04.12.2009

Эти ссылки также содержат полезную информацию:

http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx

http://blogs.msdn.com/greg_schechter/archive/2006/08/07/690704.aspx

person epotter    schedule 26.08.2009