【问题标题】:Disabling windows 10 scaling for specific application禁用特定应用程序的 Windows 10 缩放
【发布时间】:2018-08-09 13:36:01
【问题描述】:

我遇到了一些应用程序(主要是仪表板)的问题,一些用户使用窗口显示缩放来使他们的图标变大,但这会给我的软件带来很大的问题。我正在寻找一种方法来完全禁用我的应用程序的缩放,并将应用程序缩放到显示分辨率的像素。

我找到了this thread,但它已有 8 年历史,当时还不存在 Windows 10,另一个用户给出了答案,但它也不起作用。

该行为的一个简单示例主要发生在仪表板上,因为此类屏幕上有很多控件和小部件,它们对于机器人机械控制器之类的东西至关重要。

一个示例仪表板窗口的最小可能大小为1900 x 980(在两个方向上可能小 4-5 像素,但我们四舍五入以获得四舍五入的位置 XY 值)。这个分辨率只差于1920 x 1080。它不能更小,但如果你有更大的屏幕,比如4K,你可以把它做得更大,你所获得的只是树视图中的更多日期,在 3d 引擎渲染器中更好地显示等。

因此,有些用户的笔记本电脑屏幕很小,例如 15 英寸,最大分辨率为 1920 x 1080 分辨率,但他们使用 150% 缩放,因此我的屏幕最小尺寸在他们的屏幕中变为 2850 x 1470,这使得应用程序比屏幕更大并走出屏幕。

另一个例子,如果我使用的 Windows Surface Pro 的2736 x 1824 分辨率比1920 x 1080 大约大 80%,则窗口确实仍然采用屏幕上的原始1900 x 980 像素,这使它看起来很小,所以如果你全屏显示,你会在所有控件中看到更多信息。但是,如果您将缩放比例更改为 150%,则屏幕现在再次占用屏幕上的2850 x 1470 像素,这与高度完美匹配,但在宽度上我短了 100 像素,而 100 像素足以松动右侧的部分我的屏幕,您要么看不到屏幕的最左侧,要么看不到屏幕的最右侧。

我尝试了 3 种自动缩放模式:DPI、字体和无,但它根本不起作用。无论如何,它仍然会拉伸屏幕。更改表单的字体也无济于事,我设法让它直接在表单中为少数标签工作,但组框内的任何内容都无法更改或与其余部分相比大小增加两倍。

要点:

  • 项目是 .net 4.54.6 但如果我需要特定功能,在 4.7 中编译它们没有问题。
  • WPF 是不可能的。我们花了 3 年时间来实施它,但很快就以第三方 DLL 的性能非常糟糕而告终,而且 3D Cad 的性能简直糟糕透顶。
  • 屏幕已经用尽可能少的控件进行了优化。在数百个屏幕和数千个用户控件中,其中大约一半非常接近1920 x 1080 的限制,这大约是我们客户的 90%
  • 我收到了一个建议,即在客户端计算机上运行不受主机影响的 100% 缩放的虚​​拟机。这可能是我最后的选择,因为通过 VM 处理专用显卡非常困难,尤其是 Quadro 和 FireGL 等 CAD 卡。
  • 一半的用户使用触摸屏,我们尝试将所有内容都放在一个带有 2 个滚动条的面板中,天哪,这太糟糕了,而且只能在蓝月亮中运行一次。所以它只对鼠标用户有好处,这些用户都有桌面 AFAIK,所以 99% 的用户不使用缩放,所以他们没有这个问题。

那么现在有什么可以解决或解决这个问题的吗?

【问题讨论】:

  • 你可能不想听到这个,但我认为一个不尊重我的操作系统配置缩放的应用程序是反社会的,以至于我会寻找替代方案。许多人使用此设置是因为他们的眼睛无法处理较小尺寸的东西。靠在屏幕上辨别小东西会导致长期的背部问题。不要忽视用户的需求。
  • 但是,您的 app.manifest 中有 <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware> 吗? From the same "author"Some notes I've written.
  • 您说没有 WPF,但您遇到了扩展问题,没有什么比这更符合要求了。 WinForms 不适合做人。结果充其量是笨拙的。
  • GUI 窗口应该可以轻松调整大小,缩小到合理的最小大小。先解决这个问题,你也会解决这个问题。如果您以前拥有可预测的显示器尺寸和分辨率,那么说起来容易做起来难,那么您就一直在借来的时间生活。是的,已经结束了,不会再回来了。
  • @Jimi 您的额外注释部分非常完美。您是唯一指定每个操作系统版本的人,它也适用于 Windows 10。即使表单标题使用了额外的像素,因为它仍然可以缩放到足以使窗口的高度仍然完美契合。

标签: c# winforms


【解决方案1】:

您是否尝试让您的流程 DPI 感知?

您可以通过 pinvoke 来完成:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();

并调用

SetProcessDPIAware();

在您的 Main 中或创建一个 Manifest 并添加

<dpiAware>true</dpiAware>

有教程here。 清除它 DPIAware 应该会阻止窗口自行缩放。

【讨论】:

  • 它在 Windows 10 上不起作用,我已经试过了。我尝试了清单,它也不起作用
  • 链接已失效^^
猜你喜欢
  • 2017-04-04
  • 2016-09-08
  • 2016-06-19
  • 2016-11-25
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多