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

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

Синтаксис

BOOL LogicalToPhysicalPointForPerMonitorDPI(
  [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_DPI_UNAWARE создает окно на одном мониторе с коэффициентом масштабирования 200 % (192 DPI). Если оба приложения вызывают GetWindowRect в этом окне, они получат разные значения. Приложение PROCESS_DPI_UNAWARE получит прямоугольник на основе координат 96 точек на дюйм, а приложение PROCESS_PER_MONITOR_AWARE получит координаты, соответствующие фактическому DPI монитора. Если PROCESS_PER_MONITOR_AWARE требуется прямоугольник, возвращенный системой в приложение PROCESS_DPI_UNAWARE , он может вызвать LogicalToPhysicalPointForPerMonitorDPI для углов прямоугольника и передать дескриптор в окно приложения PROCESS_DPI_UNAWARE . При этом будут возвращены точки на основе осведомленности другого приложения, которые можно использовать для создания прямоугольника.

Совет  

Так как приложение со значением PROCESS_DPI_AWARENESSPROCESS_PER_MONITOR_AWARE использует фактическое разрешение монитора, физические и логические координаты для этого приложения одинаковы.

 

Требования

Требование Значение
Минимальная версия клиента 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)

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

PROCESS_DPI_AWARENESS

PhysicalToLogicalPointForPerMonitorDPI