2009-08-26 1 views
2

В моем приложении, я получаю разрешение экрана с этим кодом:ли Aero манипулирует DPI и размером экрана? Зачем?

SystemInformation.PrimaryMonitorSize 

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

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

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

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

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

ответ

7

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

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

+0

+1 Это точно. Microsoft отказалась от попыток попросить разработчиков заставить свои приложения работать правильно с настройками dpi, отличными от 96 точек на дюйм. Вместо того, чтобы большинство приложений прерывалось, если пользователь выбирает high-dpi, разработчики теперь указывают, что они поддерживают high-dpi. Пользователь по-прежнему может отключить масштабирование для каждой программы (щелчок правой кнопкой мыши, вкладка совместимости) –