问题标签 [dpi-aware]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
239 浏览

.net - Wix CustomAction 中的 DpiAware WinForm

我有一个在我的 MSI 安装程序中调用的自定义操作,它是由 Wix 工具集创建的。如果不满足某些条件,自定义操作可能会显示一个简单的窗口窗体。

我注意到该表单在高 DPI 显示器上不能很好地显示,我试图通过向 CustomAction 项目添加一个 app.manifest 文件(并取消注释 dpiAware 部分)来制作表单 DpiAware,但它似乎没有任何影响,表格在高 dpi 屏幕上仍然显得模糊。

有没有办法在 Wix MSI 安装程序中显示 DpiAware 表单作为自定义操作的一部分?

0 投票
0 回答
40 浏览

winforms - 对多个平台上的高 dpi 缩放感到困惑?

我需要我的 (Winform) 应用程序在 Windows 7、Windows 8 / 8.1 和 Windows 10 中为更高 dpi 正确扩展。我很困惑我需要哪个选项。我通过将以下内容添加到其清单中,使我的应用程序能够识别 DPI:

上面的评论说

但我不确定这适用于哪些平台?我已将 AutoScaleMode 更改为 Dpi 并设计为 96dpi。我知道这段代码可以让应用程序感知 DPI,但我不确定哪些平台?

0 投票
0 回答
651 浏览

winforms - Windows 10、8、8.1 和 7 中的高 DPI 缩放?

对于 Windows 10 Creator's edition、Windows 7、8 和 8.1,让我的应用程序能够识别 DPI 的最简单方法是什么?我看到有很多不同的选项可以添加到app.configand中,但app.manifest我很困惑为我的案例添加哪些选项。在 Windows 10 Creator's Update 之前是否支持高 dpi?我正在使用 Visual Studio 2017 开发 Winforms,我们无法迁移到 WPF。我已经阅读了这篇文章,但仍然感到困惑。

我正在考虑添加

到清单和

到 Windows 10 的 app.config 但我需要它回退到 Windows 8、8.1 和 7。

0 投票
1 回答
6260 浏览

c# - DPI 感知 - 一个版本不感知,另一个版本感知系统

所以我们有这个非常奇怪的问题。我们的应用程序是一个 C#/WinForms 应用程序。在我们的 6.0 版本中,我们的应用程序不支持 DPI。在我们的 6.1 版本中,它突然变得可以识别 DPI。
在 6.0 版本中,如果您以高 DPI 运行它,它会使用 Windows 位图缩放,这很好,因为这不会影响屏幕布局。在 6.1 版本中,由于某种原因它可以识别 DPI,因此用户界面被破坏了。
我们现在无法解决这个问题。我们有数百个屏幕,所以要让它们在 DPI 感知模式下正常工作需要很多时间。

我们已经使用 SysInternals Process Explorer 确认了这一点。在我们的 6.0 版本中,它显示Unaware,但在我们的 6.1 版本中,它最初显示Unaware,但随后更改为System Aware
后者发生在代码从 EXE 进入包含我们所有用户界面代码的程序集 DLL 时(我们的 EXE 基本上是一个非常薄的外壳;它实际上所做的只是在我们的表示层程序集上调用一个 Controller 类。)

我们已确认以下内容:

  • 两个版本均使用 VSS 2017 在发布模式下构建。
  • 两个版本都针对相同的 .NET Framework (4.5)
  • 两个版本都使用相同的 DevExpress 版本。
  • 两个版本具有相同的应用程序清单,但未启用 DPI 感知设置。
  • 这两个版本都没有调用任何与 DPI 相关的 Windows API。
  • 使用 Sys Internals 和一些消息框,我们确定了 6.1 版本在什么时候意识到(Presentation 程序集的入口点)以及在那个时候加载了哪些 DLL(我们的、DevExpress、其他依赖项),然后我们构建了一个小的虚拟应用程序引用相同的 DLL,并确认它们已加载。该虚拟应用程序不会感知 DPI。
  • 我们已经比较了两个版本之间的主要 csproj 文件,并且没有有意义的差异。
    • 这两个版本都没有引用 WPF 中的任何内容。

我们不明白为什么我们的 6.1 版本突然变得支持 DPI。我们不知道还有什么可以看的,我们需要一个修复程序,将这个版本恢复到 DPI 不感知模式。它阻碍了我们的发布。真的很感激任何指示。在这一点上,我们愿意尝试任何事情。

0 投票
1 回答
932 浏览

c# - UIAutomation 方法 ElementFromPoint() 从 Windows 10 上的记事本中检索不正确的元素

我们正在开发一个 C# Windows 窗体应用程序并使用 UI 自动化来记录用户活动。我们的应用程序将其 DPI 感知声明为 Per-monitor,因此系统不会通过坐标虚拟化对其进行欺骗。

在 Windows 10 上,我们遇到了记事本的问题:在执行屏幕缩放后,调用 UIA 方法ElementFromPoint()并传递了正确的物理坐标时返回了不正确的元素。此外,调用返回的 BoundingRectangle 的坐标CurrentBoundingRectangle()也不正确:除以当前屏幕比例值,即 1.5 表示 150%。

有没有人遇到过这个问题,你是如何解决的?

背景

并非记事本窗口的所有 UI 元素都会受到影响:只有系统按钮和主菜单项。其他元素,如主文本区域、滚动条、窗口标题、对话框按钮、子菜单项,都得到了正确处理。

考虑以下测试代码:

在 Win 10 上,此代码为“文件”主菜单项返回不正确的元素和 BoundingRectangle:

MouseDown 收到:X=735 Y=391

UIA 元素:名称=应用程序

rect=[left=475 top=249 right=822 bot=268]

系统按钮的 BoundingRectangle 不正确:

收到 MouseDown:X=701 Y=282

UIA 元素:名称=系统

rect=[left=453 top=183 right=475 bot=205]

并为其他 UI 控件更正元素和 BoundingRectangle(即文件 -> 保存子菜单项):

MouseDown 收到:X=1386 Y=666

UIA 元素:名称=保存

矩形=[左=1320 上=652 右=1452 机器人=691]

这些结果不会在自称为系统 DPI 感知的旧版本记事本上重现。

例如,在 Windows 7 上,总是检索正确的元素和边界矩形。

此外,我还在 Win 10 上测试了其他实现 Per-monitor DPI 感知模式的应用程序:Acrobat Reader DC、Edge、Skype、Slack、Explorer。这些应用程序的主菜单也得到了正确处理:检索了正确的元素和边界矩形。

因此,Windows 10 记事本的每监视器模式实现中可能存在问题。

0 投票
1 回答
256 浏览

c++ - Windows 8 之前的 GetProcessDpiAwareness()

我知道我可以用它GetProcessDpiAwareness()来检查特定进程的 dpi 意识。但是,这仅在 Windows 8.1 及更高版本中受支持。有什么方法可以在此之前查询进程的 dpi 意识吗?我找不到任何关于它的信息。

特别是我想知道该进程是否运行[x] Disable display scaling on high DPI settings(至少可以从 Windows 7.

0 投票
1 回答
121 浏览

highdpi - 图标大小在更高 DPI 中没有增加

我在 DPI 大于 100 时遇到了这个问题。我更改了图标的大小,例如粗体、斜体,当我以 100 dpi 运行程序时,图标大小更大,但是当我在更改为 dpi 后运行程序时大于 100 图标越来越小,并且没有更新到任何大小值。我试过 autosize = false,图像缩放到无。

0 投票
1 回答
1471 浏览

winapi - 如何使用我自己的清单文件并将其嵌入到使用 Visual Studio 2017 的可执行文件中?

我正在尝试使用 PerMonitorV2 DPI 感知,它会在 DPI 更改时调整非客户区的大小。MSDN 文档建议使用清单设置 DPI 感知模式: 为进程设置默认 DPI 感知

VS Configuration Properties 的 Manifest Tool 部分仅提供了三个 DPI Awareness 选项:None(不知道)、Hight DPI AwarePer Monitor DPI Aware(似乎是 PerMonitorV1),所以我需要找到一些方法来覆盖这些 DPI 设置,但我不知道该怎么做。(我最好的猜测是以某种方式提供我自己的清单文件,而不是依靠 Visual Studio 来生成一个。)

0 投票
1 回答
1183 浏览

winapi - VERTRES 和 HORZRES 取决于系统启动时的缩放设置

我最近一直在使用 WINAPI 来检索缩放设置和屏幕分辨率,我遇到了这种奇怪的行为。

我有一个小的 C++ 程序(下面有列表),它可以检索 VERTRES、HORZRES、DESKTOPVERTRES 和 DESKTOPHORZRES 的值。我的程序还将 DPI 感知模式设置为 1(系统级感知)。我注意到 VERTRES、HORZRES 报告的值取决于系统启动时使用的系统比例因子。

所以在我的笔记本电脑上,我将系统缩放系数配置为 150%,分辨率为 1920x1080。那是启动时的配置。当我检索 HORZRES 和 DESKTOPHORZRES 时,两个值都报告为 1920。

如果我将缩放设置更改为 100% 并且不重新启动计算机,则下次检索这些值时,它们会报告为 2880(对于 HORZRES)和 1920(对于 DESKTOPHORZRES)。

在我重新启动计算机并将缩放设置设置为 100% 后,这两个值再次报告为 1920。

如果我再次将缩放比例更改为 150%,则值将报告为 1280 (HORZRES) 和 1920 (DESKTOPHORZRES)。

仅当我将 DPI 感知设置为 1 时才观察到所描述的行为,如果它设置为 0(“不感知”)或 2(“每屏幕感知”)值始终报告为 1280(HORZRES)和 1920(DESKTOPHORZRES)无论在启动时如何配置缩放。

我想知道为什么 HORZRES(或 VERTRES)报告的值取决于系统启动时使用的比例因子?这是预期的行为吗?

如果上面已经在某处进行了描述,我将不胜感激任何参考。

0 投票
1 回答
1474 浏览

c# - 显示缩放 150% 时 Windows 窗体不缩放高度

我已经把它归结为一个非常简单的复制品,并且无法弄清楚这个表格出了什么问题。当以 96 DPI / 100% 比例运行时,它看起来很好:

在此处输入图像描述

但是当以 144 DPI / 150% 比例(甚至 96 DPI / 150% 比例)运行时,除了表单高度之外,所有内容都会缩放:

在此处输入图像描述

最初我认为这是一个 DPI 问题,但在验证它以 96 DPI 重现后,我不确定发生了什么。

除了专门设置对话框的字体并将 AutoScaleMode 设置为 DPI 之外,对话框或控件没有什么特别之处。表单位于应用程序自动加载的程序集中。

我正在使用 .NET 4.7.2 和 Windows 10。

这是表单代码:

这是设计器文件:

在 app.config 我根据文档设置 DpiAwareness :

在清单中,我正在设置兼容性:

所有这些都根据此处的高 DPI 支持说明进行

应用程序代码仅显示对话框:

谁能看到我可能做错了什么,或者我错过了什么?

提前致谢!