GetSystemMetrics () возвращает неправильное значение для SM_CXSCREEN - PullRequest
9 голосов
/ 13 апреля 2010

Я столкнулся с интересной проблемой. По крайней мере, в Vista, getSystemMetrics (SM_CXSCREEN) возвращает неверное значение, когда настройки DPI рабочего стола не установлены на 100%. Например, я пробовал 150% на экране 1366x768 и getSystemMetrics () возвращает 911 вместо 1366 (и 1366 / 1,5 ~ 911)

Согласно MSDN, getSystemMetrics (SM_CXSCREEN) возвращает пиксели, поэтому я подумал, что это значение не будет зависеть от настроек DPI, но это так. Так есть ли более безопасный способ узнать истинное немасштабированное разрешение экрана?

Ответы [ 3 ]

10 голосов
/ 13 апреля 2010

Программа должна сообщить операционной системе, что она поддерживает DPI, чтобы получить истинное разрешение, когда вы превышаете 125%. Это лучше всего сделать с манифестом, как описано в этой статье MSDN Library .

5 голосов
/ 19 июня 2011

Чтобы ваше приложение знало о файле dpi make и manifest и поместило в него следующий текст.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
1 голос
/ 15 декабря 2016

Прежде чем получить правильные метрики пикселей от таких функций, как GetSystemMetrics или GetClientRect, ваше приложение должно заявить операционной системе, что оно знает о DPI, и поэтому не будет все портить.

Было несколько изменений в том, как это рекомендуется. См. Документы MSDN для получения более подробной информации.

Начиная с Windows 10:

::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

Или начиная с Windows 8.1:

::SetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

Или начиная с Vista:

::SetProcessDPIAware();

После вызова этой функции функция GetSystemMetrics и т. Д. Должна возвращать правильные значения вашему приложению в пикселях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...