gpt4 book ai didi

windows - 从外部窗口的 GetWindowRect 获取 DPI 感知正确的 RECT

转载 作者:可可西里 更新时间:2023-11-01 12:32:19 25 4
gpt4 key购买 nike

我正在制作一个应用程序 DPI Aware,但我需要对来自其他应用程序的 HWND 执行 GetWindowRect。我的问题是这在同样具有 DPI 感知能力的应用程序上运行良好,但我如何检测 HWND 句柄是否为 DPI 虚拟化,例如缩放以便我可以自己缩放?或者是否有其他我错过的 API 可以从另一个进程的 HWND 中以 DPI 感知方式为我提供窗口大小?

我已经尝试过 LogicalToPhysicalPoint 但似乎总是失败,可能是因为 HWND 不属于我的应用程序。

最佳答案

这不是实际问题。如果您将您的进程标记为高 DPI 感知,那么系统将不再进行任何类型的 DPI 虚拟化,并且 API 将不再欺骗您实际值。

特别是,如果您从高 DPI 感知应用程序调用 GetWindowRectGetClientRect,您将获得屏幕坐标中的实际值 .这不仅适用于属于您的应用程序进程的窗口,也适用于属于其他进程的窗口,无论其他进程的 DPI 感知设置如何。

从 Windows 8.1 开始,PhysicalToLogicalPointLogicalToPhysicalPoint功能不再是必需的,实际上不做任何事情。这两个函数的文档明确指出了这一点:

In Windows 8.1, the additional virtualization of the system and inter-process communications means that for the majority of applications, you do not need these APIs. As a result, in Windows 8.1, PhysicalToLogicalPoint and LogicalToPhysicalPoint no longer transform points. The system returns all points to an application in its own coordinate space.

最后一句话只是我上面所说的一种不同的措辞方式。 系统根据调用者的 DPI 感知返回值。如果您的进程是高 DPI 感知的,那么您将获得真正的值。您不需要自己缩放值。如果您不了解高 DPI,那么您可能会在实际值方面被骗。但这是有道理的,因为假设您无法处理真相并且不会做出适当的 react 。

为了清楚起见,我应该指出,从 Windows 8.1 开始(并在 Windows 10 中继续),现在实际上有两个级别的高 DPI 感知:

  1. 第一层是高 DPI 感知,早在 Windows Vista 中就引入了。这由应用程序 list 文件中的 true 设置指示,它仅意味着您(应用程序)能够处理设置为的系统 DPI经典默认值 96 DPI 以外的东西。

    根据以上知识,那么,我们知道,如果具有此 DPI 感知设置的进程调用返回屏幕坐标的 API 函数,它将收到系统 DPI 的值。

  2. 然后是随 Windows 8.1 引入的新级别,即 per-monitor 高 DPI 感知。这由应用程序 list 中的 True/PM 设置指示,这意味着您(应用程序)能够处理具有不同 DPI 设置的不同显示器。换句话说,虽然系统默认 DPI 仍然存在(可能是 96 DPI,也可能是其他),但可能有连接到系统的显示器使用不同的 DPI 设置(不同于系统 DPI 的设置)。

    同样,基于上述理解,我们知道,如果一个每个监视器高 DPI 感知的进程调用一个返回屏幕坐标的 API 函数,它将收到相对于包含的监视器 DPI 的实际坐标有问题的窗口。

如果您的进程根本不知道 DPI( list 中没有设置,或者 false),那么当您调用返回屏幕坐标的 API 函数时,您将收到基于缩放/虚拟化的坐标在 96 DPI 的全系统 DPI 上。

关于windows - 从外部窗口的 GetWindowRect 获取 DPI 感知正确的 RECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8060280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com