LogicalToPhysicalPointForPerMonitorDPI 函数 (winuser.h)

将窗口中的点从逻辑坐标转换为物理坐标,而不考虑调用方的每英寸 (dpi) 感知点数。 有关 DPI 感知级别的详细信息,请参阅 PROCESS_DPI_AWARENESS

语法

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

参数

[in] hWnd

其转换用于转换的窗口的句柄。

[in, out] lpPoint

指向 POINT 结构的指针,该结构指定要转换的逻辑坐标。 如果函数成功,则新的物理坐标将复制到此结构中。

返回值

如果成功,则返回 TRUE ,否则返回 FALSE

注解

在 Windows 8 中,使用 PhysicalToLogicalPointLogicalToPhysicalPoint 在物理空间和逻辑空间之间转换系统 DPI 感知应用程序。 在 Windows 8.1 中,系统的额外虚拟化和进程间通信意味着,对于大多数应用程序,你不需要这些 API。 因此,在Windows 8.1中,这些 API 不再转换点。 系统在其自己的坐标空间中返回应用程序的所有点。 此行为保留了大多数应用程序的功能,但在某些情况下,必须进行更改以确保应用程序按预期工作。

例如,应用程序可能需要遍视另一个进程的整个窗口树,并请求系统提供有关窗口的 DPI 相关信息。 默认情况下,系统会根据调用方 DPI 感知返回信息。 这适用于大多数应用程序。 但是,调用方可能需要基于与窗口关联的应用程序的 DPI 感知信息。 这可能是必要的,因为两个应用程序直接在彼此之间发送依赖于 DPI 的信息。 在这种情况下,应用程序可以使用 LogicalToPhysicalPointForPerMonitorDPI 获取物理坐标,然后使用 PhysicalToLogicalPointForPerMonitorDPI 根据提供的 HWND 的 DPI 感知将物理坐标转换为逻辑坐标。

假设有两个应用程序,一个 应用程序的PROCESS_DPI_AWARENESS 值为 PROCESS_DPI_UNAWARE ,另一个应用程序的值为 PROCESS_PER_MONITOR_AWAREPROCESS_DPI_UNAWARE应用在单个监视器上创建一个窗口,其中比例系数为 200% (192 DPI) 。 如果两个应用都在此窗口中调用 GetWindowRect ,它们将收到不同的值。 PROCESS_DPI_UNAWARE应用将收到基于 96 DPI 坐标的矩形,而PROCESS_PER_MONITOR_AWARE应用将接收与监视器实际 DPI 匹配的坐标。 如果 PROCESS_PER_MONITOR_AWARE 需要系统返回到 PROCESS_DPI_UNAWARE 应用的 rect,它可以调用其矩形角的 LogicalToPhysicalPointForPerMonitorDPI ,并将句柄传递到 PROCESS_DPI_UNAWARE 应用的窗口。 这将基于可用于创建 rect 的其他应用的感知返回点。

提示  

由于 PROCESS_DPI_AWARENESS 值为 PROCESS_PER_MONITOR_AWARE 的应用程序使用监视器的实际 DPI,因此此应用的物理坐标和逻辑坐标相同。

 

要求

要求
最低受支持的客户端 Windows 8.1 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 R2 [仅限桌面应用]
目标平台 Windows
标头 winuser.h
Library User32.lib
DLL User32.dll
API 集 Windows 10版本 10.0.14393 中引入的 ext-ms-win-ntuser-window-l1-1-4 ()

另请参阅

PROCESS_DPI_AWARENESS

PhysicalToLogicalPointForPerMonitorDPI