physicalToLogicalPointForPerMonitorDPI 函数 (winuser.h)
将窗口中的点从物理坐标转换为逻辑坐标,而不考虑每英寸点数 (dpi) 对调用者的感知。 有关 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 根据提供的 HWND 的 DPI 感知将物理坐标转换为逻辑坐标。
假设有两个应用程序,一个 应用程序的PROCESS_DPI_AWARENESS 值为 PROCESS_DPI_UNAWARE ,另一个应用程序的值 是 PROCESS_PER_MONITOR_AWARE。 PROCESS_PER_MONITOR_AWARE应用在单个监视器上创建一个窗口,其中比例系数为 200% (192 DPI) 。 如果两个应用都在此窗口中调用 GetWindowRect ,它们将收到不同的值。 PROCESS_DPI_UNAWARE应用将接收基于 96 DPI 坐标的矩形,而PROCESS_PER_MONITOR_AWARE应用将接收与监视器的实际 DPI 匹配的坐标。 如果 PROCESS_DPI_UNAWARE 需要系统返回到 PROCESS_PER_MONITOR_AWARE 应用的 rect,它可以为其矩形的角调用 LogicalToPhysicalPointForPerMonitorDPI ,并将句柄传递到 PROCESS_PER_MONITOR_AWARE 应用的窗口。 这将基于可用于创建 rect 的其他应用的感知返回点。 这之所以有效,是因为 PROCESS_PER_MONITOR_AWARE 使用监视器的实际 DPI,因此逻辑坐标和物理坐标是相同的。
要求
最低受支持的客户端 | Windows 8.1 [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2012 R2 [仅限桌面应用] |
目标平台 | Windows |
标头 | winuser.h |
Library | User32.lib |
DLL | User32.dll |
API 集 | ext-ms-win-ntuser-window-l1-1-4 (在 Windows 10 版本 10.0.14393 中引入) |