Функция PhysicalToLogicalPointForPerMonitorDPI (winuser.h)

Преобразует точку в окне из физических координат в логические, независимо от количества точек на дюйм (точек на дюйм) вызывающего объекта. Дополнительные сведения об уровнях осведомленности о DPI см. в разделе PROCESS_DPI_AWARENESS.

Синтаксис

BOOL PhysicalToLogicalPointForPerMonitorDPI(
  [in]      HWND    hWnd,
  [in, out] LPPOINT lpPoint
);

Параметры

[in] hWnd

Дескриптор окна, преобразование которого используется для преобразования.

[in, out] lpPoint

Указатель на структуру POINT , задающую преобразуемые физические координаты или координаты экрана. Новые логические координаты копируются в эту структуру при успешном выполнении функции.

Возвращаемое значение

Возвращает значение TRUE в случае успешного выполнения или FALSE в противном случае.

Комментарии

В Windows 8 приложения с поддержкой системного DPI преобразуют между физическим и логическим пространством с помощью PhysicalToLogicalPoint и LogicalToPhysicalPoint. В Windows 8.1 дополнительная виртуализация системы и межпроцессного взаимодействия означает, что для большинства приложений эти API не нужны. В результате в Windows 8.1 эти API больше не преобразуют точки. Система возвращает все точки приложения в собственном пространстве координат. Это поведение сохраняет функциональность для большинства приложений, но есть некоторые исключения, в которых необходимо внести изменения, чтобы убедиться, что приложение работает должным образом.

Например, приложению может потребоваться пройти все дерево окна другого процесса и запросить у системы сведения о окне, зависящие от DPI. По умолчанию система будет возвращать сведения на основе сведений о DPI вызывающей стороны. Это идеально подходит для большинства приложений. Тем не менее вызывающей стороне могут потребоваться сведения на основе сведений о DPI приложения, связанного с окном. Это может быть необходимо, так как два приложения напрямую отправляют данные, зависящие от DPI. В этом случае приложение может использовать LogicalToPhysicalPointForPerMonitorDPI для получения физических координат, а затем использовать PhysicalToLogicalPointForPerMonitorDPI для преобразования физических координат в логические координаты на основе уровня DPI предоставленного HWND.

Рассмотрим два приложения: одно имеет PROCESS_DPI_AWARENESS значение PROCESS_DPI_UNAWARE , а другое — значение PROCESS_PER_MONITOR_AWARE. Приложение PROCESS_PER_MONITOR_AWARE создает окно на одном мониторе, где коэффициент масштабирования составляет 200 % (192 точек на дюйм). Если оба приложения вызывают GetWindowRect в этом окне, они получат разные значения. Приложение PROCESS_DPI_UNAWARE получит прямоугольник на основе координат 96 точек на дюйм, а приложение PROCESS_PER_MONITOR_AWARE получит координаты, соответствующие фактическому DPI монитора. Если PROCESS_DPI_UNAWARE требуется прямоугольник, возвращенный системой в приложение PROCESS_PER_MONITOR_AWARE , он может вызвать LogicalToPhysicalPointForPerMonitorDPI для углов своего прямоугольника и передать дескриптор в окно приложения PROCESS_PER_MONITOR_AWARE . При этом будут возвращены точки на основе осведомленности другого приложения, которые можно использовать для создания прямоугольника. Это работает, так как PROCESS_PER_MONITOR_AWARE использует фактическое значение DPI монитора, логические и физические координаты идентичны.

Требования

   
Минимальная версия клиента Windows 8.1 [только классические приложения]
Минимальная версия сервера Windows Server 2012 R2 [только классические приложения]
Целевая платформа Windows
Header winuser.h
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-window-l1-1-4 (представлено в Windows 10 версии 10.0.14393)

См. также раздел

LogicalToPhysicalPointForPerMonitorDPI

PROCESS_DPI_AWARENESS