- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在制作一个应用程序 DPI Aware,但我需要对来自其他应用程序的 HWND 执行 GetWindowRect
。我的问题是这在同样具有 DPI 感知能力的应用程序上运行良好,但我如何检测 HWND
句柄是否为 DPI 虚拟化,例如缩放以便我可以自己缩放?或者是否有其他我错过的 API 可以从另一个进程的 HWND 中以 DPI 感知方式为我提供窗口大小?
我已经尝试过 LogicalToPhysicalPoint
但似乎总是失败,可能是因为 HWND 不属于我的应用程序。
最佳答案
这不是实际问题。如果您将您的进程标记为高 DPI 感知,那么系统将不再进行任何类型的 DPI 虚拟化,并且 API 将不再欺骗您实际值。
特别是,如果您从高 DPI 感知应用程序调用 GetWindowRect
或 GetClientRect
,您将获得屏幕坐标中的实际值 .这不仅适用于属于您的应用程序进程的窗口,也适用于属于其他进程的窗口,无论其他进程的 DPI 感知设置如何。
从 Windows 8.1 开始,PhysicalToLogicalPoint
和 LogicalToPhysicalPoint
功能不再是必需的,实际上不做任何事情。这两个函数的文档明确指出了这一点:
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
andLogicalToPhysicalPoint
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 感知:
第一层是高 DPI 感知,早在 Windows Vista 中就引入了。这由应用程序 list 文件中的 true
设置指示,它仅意味着您(应用程序)能够处理设置为的系统 DPI经典默认值 96 DPI 以外的东西。
根据以上知识,那么,我们知道,如果具有此 DPI 感知设置的进程调用返回屏幕坐标的 API 函数,它将收到系统 DPI 的值。
然后是随 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/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!