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 中,使用 PhysicalToLogicalPoint 和 LogicalToPhysicalPoint 在物理空间和逻辑空间之间转换系统 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_AWARE。 PROCESS_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 () |