- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图在 WinForms 应用程序中检测它是否由于操作系统具有高 DPI 而在缩放/虚拟化模式下启动。目前,在以 3840x2400 和 200% 缩放比例运行的系统中,应用程序看到的分辨率为 1920x1200,DPI 为 96,比例因子为 1。
我们正在使应用程序具有 DPI 感知能力,但在那之前,我们需要一个“快速修复”来检测是否缩放。这样做的原因是它破坏了应用程序中截取屏幕截图的功能。我们在 Graphics.CopyFromScreen 中使用缩放尺寸,它会截取错误尺寸的屏幕截图,因为它需要非缩放尺寸。
我知道 DPI 感知设置,但目前,我们仍然希望应用程序被缩放,但如果可能的话,能够检测到我们被缩放并获取非缩放尺寸。
最佳答案
未明确标记为高 DPI 感知的应用程序将被系统欺骗并告知有 96 DPI,缩放因子为 100%。为了获得真正的 DPI 设置,并避免 DWM 自动虚拟化,您需要包含 <dpiAware>True/PM</dpiAware>
在您的应用程序 list 中。更多信息可用 here .
就您而言,听起来您正在寻找 LogicalToPhysicalPointForPerMonitorDPI
和 PhysicalToLogicalPointForPerMonitorDPI
对函数。正如链接文档所解释的那样,默认情况下,系统将根据调用者的 DPI 感知返回有关其他窗口的信息。因此,如果非 DPI 感知应用程序尝试获取高 DPI 感知进程的窗口边界,它将获得已转换为自己的非 DPI 感知坐标空间的边界。用这些函数的术语来说,这就是“逻辑”坐标。您可以将这些转换为“物理”坐标,即操作系统(和其他高 DPI 感知进程)实际使用的坐标。
不过,要回答您的实际问题:如果您绝对需要在不了解 DPI 的进程中突破操作系统的谎言,我可以想到两种方法:
GetScaleFactorForMonitor
功能。 如果由此产生 DEVICE_SCALE_FACTOR
value 不是 SCALE_100_PERCENT
,那么你就被缩放了。如果您的应用程序不支持 DPI,那么您正在被虚拟化。GetScaleFactorForMonitor
函数返回 SCALE_140_PERCENT
预计何时返回 SCALE_150_PERCENT
(144/96 == 1.5)。我真的不明白为什么会这样。我唯一能弄清楚的是,它是为 Windows 8.1 上的 Metro/Modern/UWP 应用程序设计的,其中 150% 不是有效的比例因子,但 140% 是。此后缩放因子为 unified in Windows 10 ,但此功能似乎尚未更新,并且仍然为桌面应用程序返回不可靠的结果。 HMONITOR
(处理特定的物理监视器)。您可以通过拨打 MonitorFromWindow
来做到这一点。 ,将句柄传递给 WinForms 窗口,并指定 MONITOR_DEFAULTTONEAREST
.这将使您了解正在显示您感兴趣的窗口的监视器。GetMonitorInfo
来获取该监视器的逻辑宽度。功能。这会填入 MONITORINFOEX
structure作为其成员之一,它包含一个 RECT
包含该监视器的虚拟屏幕坐标的结构 ( rcMonitor
)。 (请记住,与 .NET 不同,Windows API 用左、上、右和下范围表示矩形。宽度是右范围减去左范围,而高度是下范围减去上范围。 )MONITORINFOEX
由 GetMonitorInfo
填充的结构还将为您提供该监视器的名称(szDevice
成员)。然后您可以使用该名称来调用 EnumDisplaySettings
函数,它将填写一个 DEVMODE
包含有关该显示器物理显示模式的大量信息的结构。您感兴趣的成员(member)是dmPelsWidth
和 dmPelsHeight
,分别为您提供每个宽度和高度的物理像素数。// Get the monitor that the window is currently displayed on
// (where hWnd is a handle to the window of interest).
HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
// Get the logical width and height of the monitor.
MONITORINFOEX miex;
miex.cbSize = sizeof(miex);
GetMonitorInfo(hMonitor, &miex);
int cxLogical = (miex.rcMonitor.right - miex.rcMonitor.left);
int cyLogical = (miex.rcMonitor.bottom - miex.rcMonitor.top);
// Get the physical width and height of the monitor.
DEVMODE dm;
dm.dmSize = sizeof(dm);
dm.dmDriverExtra = 0;
EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm);
int cxPhysical = dm.dmPelsWidth;
int cyPhysical = dm.dmPelsHeight;
// Calculate the scaling factor.
double horzScale = ((double)cxPhysical / (double)cxLogical);
double vertScale = ((double)cyPhysical / (double)cyLogical);
ASSERT(horzScale == vertScale);
关于c# - 检测非 DPI 感知应用程序是否已缩放/虚拟化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507031/
晚安,我正在与一些合作伙伴使用 javaFx 制作一个应用程序;我们的想法是它将在 Windows 和 Linux 中使用。我们进行了一些测试,发现应用程序在两种操作系统中的显示有所不同。 我们正在使
我有一项服务,可通过 CreateProcessAsUser 将可执行文件启动到用户 session 中,并在 STARTUPINFO 参数中指定桌面。它运行良好。 我的可执行文件没有显示出来,也没有
当每个文件写入集群时,HDFS 会创建一个复制管道。假设有两个 Rack 1 和 5。根据 Rack 感知,第一个 block 将被保存到 Rack 1,其他两个复制 block 将被插入 Rack
我正在做一个 Django 项目,我对时区感到困惑。 我有一个事件对象,它有 publish_start 和 publish_end 日期。 控制台输出示例; campaingObject.publi
我在下面有一个函数,它通过将字体 (.ttf) 复制到 Windows 字体文件夹然后触发 WM_FONTCHANGE 消息将其安装到 Windows 中。但是,该字体不会立即在 Windows 资源
是否有类似 grep 的 Unix/Linux 命令行工具可以理解由 log4j 或 logback 打印的日志文件中的 Java 堆栈跟踪?该工具应该理解堆栈跟踪由多行组成。 典型的用例是在查看存储
每次我在我的 SCM 中看到诸如导入或方法签名更改(例如变量的重命名)之类的冲突时,我想知道是否有类似语言感知的 diff/merge 方法可以处理更烦人的小更改发生在共享项目上。有什么东西可以在 U
我使用 astyanax 连接池定义如下: ipSeeds = "LOAD_BALANCER_HOST:9160"; conPool.setSeeds(ipSeeds) .setDiscoveryTy
据我所知,OCaml 中的字符串只是简单的字节序列。他们没有编码的概念。 这对于大多数用途来说都很好。但是,标准库的某些部分对以单字节字符集编码的字符串做出了假设,例如 printf 的对齐功能: #
据我所知,OCaml 中的字符串只是简单的字节序列。他们没有编码的概念。 这对于大多数用途来说都很好。但是,标准库的某些部分对以单字节字符集编码的字符串做出了假设,例如 printf 的对齐功能: #
我正在使用 this enhanced version of WebClient登录网站: public class CookieAwareWebClient : WebClient {
我正在尝试将 Awareness API 集成到一个新项目中,但我遇到了一条错误消息:ACL_ACCESS_DENIED 状态代码:7503。 我也在其他项目中集成了 Awareness API,但上
有什么方法可以定义一个 spring bean,当 session 中的数据发生变化时,它会得到通知? 如果可能的话,我还想知道纯 Java 解决方案。我想要的只是当我在 httpsession 中添
有没有方便有效的方式以 NUMA 感知方式使用 cpp 标准容器 API? 我想在 cpp 环境中执行 OpenMP 并行稀疏矩阵 vector 乘法。要分配和初始化与 NUMA 域有关的 vecto
我正在创建一个程序,它使用 SetWindowPos() 从另一个进程移动/调整窗口大小。我自己的程序是 PROCESS_PER_MONITOR_DPI_AWARE。其他程序可以是 PROCESS_D
我一直在研究许多 JDBC 连接池,但我有一个特定的要求,即池需要是 JTA 感知的,这给我留下了 Apache DBCP 和 OW2 XAPool 的简短列表。我查看的其他池(c3p0、Proxoo
我有一个 php 脚本,可以在服务器上发出一系列请求。第一个请求将是登录请求。 问题是 file_get_contents 似乎每次都创建一个新 session ,那么我怎样才能让它感知 sessio
我有一个整数,表示 unix 纪元之后的微秒数。 (格林威治标准时间) 如何使用 astype 将 1349863207154117 转换为 pandas.Timestamp("2012-10-10T
我有一个 Web 服务,我正在尝试将变量 Autowiring 到其中。这是类(class): package com.xetius.isales.pr7.service; import java.u
再会! 我已经在 WPF 应用程序上工作了一段时间(作为一种学习体验,哦,天哪,这是一种学习体验),它终于可以发布了。发布意味着将其安装在我的 HTPC 上,用于浏览我的电影收藏。 我在运行 1920
我是一名优秀的程序员,十分优秀!