问题标签 [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 投票
1 回答
338 浏览

c# - 无法让 NotifyIcon 加载高 DPI 资源以进行 DPI 缩放 >= 150%

我的应用程序是 DPI-Aware,这是完整的清单:

我正在NotifyIcon像这样设置我的图标属性:

但是,这不适用于我的 Windows 8.1 系统上等于或高于 150% 的 DPI 缩放。当设置为 100% 时SystemInformation.SmallIconSize报告 16x16 尺寸(正确),当设置为 125% 时报告 20x20 尺寸(正确),高于此值,例如 150%,它应该报告 24x24 尺寸,但报告 16x16 并加载错误的分辨率从我的图标文件。

阅读以下文章(http://blog.quppa.net/2011/01/07/small-icon-size-dpi-in-windows/)它告诉我......

WPF 和 WinForms 都使用参数 SM_CXSMICON(小图标宽度)和 SM_CYSMICON(小图标高度)的 Win32 GetSystemMetrics 函数。

这意味着可能没有必要给GetSystemMetrics自己打电话,对吧?

关于如何解决这个问题的任何想法?

PS:我说的是我正在开发的一个开源应用程序,所以如果你想仔细查看完整的源代码,你可以在这里进行。

0 投票
3 回答
27024 浏览

java - Java禁用dpi-aware不起作用

我正在尝试使用-Dsun.java2d.dpiaware=false参数运行 Java 应用程序,但没有任何反应。

我希望用户界面模糊,但图标和字体大小正常,似乎这个标志不起作用。

我在 Windows 8.1 上使用 JDK 1.8.0_45。

我发现了这个错误https://bugs.openjdk.java.net/browse/JDK-8080153但我不明白如何解决它。

0 投票
2 回答
1895 浏览

windows - 使 Windows 通用对话框“每个监视器 DPI 感知”

我有一个使用 MFC 在 VS2008 中创建的程序。现在我已经对其进行了修改,使其成为“Per Monitor DPI-Aware”,几乎完成了。我已经修改了清单并处理了 WM_DPICHANGE 消息。但是还有一个问题:

我使用CFileDialog类显示打开/保存对话框,并使用SHBrowseForFolder函数显示文件夹选择对话框。但是所有这些对话框都不是 Per Monitor DPI-Aware”,当您在具有不同 DPI 设置的监视器之间移动它们时,它们不会调整它们的 UI。

我使用 spy++ 来监视这些对话框的消息,我发现他们可以收到 WM_DPICHANGED 消息,但他们只是不处理它。

我已经在 Windows 10 上测试了 notepad.exe 中的打开文件对话框,它运行良好。

有谁知道如何使这些对话框“每监视器 DPI-Aware”?

--------编辑--------

还有两个问题:

  1. 当我将窗口移动到具有不同 DPI 的监视器时,窗口会自行调整大小,但标题栏的高度和标题字体大小不会改变。
  2. 复选框控件的框大小也没有改变。

我觉得这些问题可能有某种联系,但我想不通。

--------悲伤的消息--------

我用VS2013编译了微软的“DPI Tutorial Sample”,也出现了同样的问题。

https://code.msdn.microsoft.com/DPI-Tutorial-sample-64134744

0 投票
2 回答
10070 浏览

wpf - 我的 WPF 应用程序是开箱即用的 per-monitor dpi-aware。我没想到?

我对 WPF 中的 per-monitor dpi-aware 有点困惑。我认为您需要做一些工作才能使您的窗口在不同的监视器上正确缩放(如开发每监视器 DPI-Aware WPF 应用程序中所述)。

但是我刚刚在带有两个显示器(2560x1440 和 2160x1440)的电脑上运行了我的应用程序,当我在显示器之间移动对话时,对话会自动缩放。那是在最新的快速环 Windows 10 上。我错过了什么吗?

0 投票
1 回答
155 浏览

delphi - 在 XE2 应用程序中创建 Delphi 7 COM 服务器会导致表单在高 DPI 笔记本电脑上扩展

我们有一个用 Delphi 7 编写的 COM 服务器 DLL,它可以从用 XE2 编写的 VCL 应用程序中使用。

在分辨率为 3000x2000 的 Microsoft Surface Book 上,XE2 应用程序启动正常并正常缩放,但是当用户单击导致使用 COM DLL 的选项时,主窗体突然缩小到一半大小,同时文本和控件。

我们有一个相关的 Delphi 7 VCL 应用程序有同样的问题,但我们现在包含一个自定义清单,明确指出 DPIAware 是错误的。这在 Surface Book 上运行良好。我们在 COM DLL 上尝试了相同的技术,但没有效果。

如果我们有首选外部清单的注册表值并在 XE2 应用程序中包含一个清单文件,我们可以使用我们的 Delphi 7 COM DLL 使 XE2 程序正确扩展。但是,它还使用 WinExec 从内部执行另一个 XE2 应用程序,然后这个第二个 XE2 应用程序的扩展性很差。包含第二个 XE2 应用程序的清单无效,除非直接运行而不是从第一个 XE2 应用程序内运行。

奇怪的是,如果我们在 XE2 中构建一个 COM 服务器,它总是在高 DPI 情况下正确扩展,即使没有自定义清单,所以我们目前正在尝试将 Delphi 7 DLL 转换为 XE2,但它有很多工作许多旧版组件包不再适用于 XE2。

请注意,一旦为 COM 服务器调用 CoCreate,XE2 应用程序就会缩小。当 COM 服务器被释放时,它不会缩回到原来的大小。

有没有人知道如何让 Delphi 7 DLL 向 Windows 报告它不支持 DPI,以便使用它的其他不支持 DPI 的应用程序不会突然不正确地缩放?

0 投票
2 回答
1364 浏览

c# - 从 C# 调用 GetProcessDpiAwareness 总是返回错误 E_INVALIDARG

我想在 Windows 10 Pro 64 位中检索指定进程 ID 的有效 DPI 感知值。我需要的值是我可以使用 WinAPI GetProcessDpiAwareness函数获得的PROCESS_DPI_AWARENESS之一。

为了实现我所需要的,我在 VS 2015 中编写了一个简单的单窗口 C# WPF 应用程序。我在 TextBox txtProcessID 中输入我感兴趣的进程 ID,当我按下 txtProcessID 按钮时,结果会显示在 TextBlock txtResult 中:

但是为任何进程调用 GetProcessDpiAwareness 总是会给我一个错误 E_INVALIDARG。我究竟做错了什么?

0 投票
0 回答
544 浏览

c++ - 如何为非 dpi 感知进程获取 dwm 的比例因子?

控件的大小和位置由 windows (dwm) 修改。我需要一种方法来获得 x 和 y 的精确缩放来平衡这一点。

我不能使用清单,因为我正在向.exe (3ds Max)编写插件。我无法更改 3dsMax 的清单(我不是 Autodesk。我无法调用setprocessdpiawareness(),因为我是另一个插件(dll)exe,我会杀死我的父进程的布局。

该解决方案应该在 Windows 7、8、10 中运行。所以我不能使用在 10 或 8.1 中引入的调用

我已经尝试过:

这不会改变任何东西(积分不变)。我确实使用老式 C++ 和通用控件(子类化)。没有 WPF,再次因为我不能使用 WPF,因为它不能与我的父 exe 一起运行。

将魔术“2*”添加到控件的大小和位置后,我确实得到了我想要的位置。但这是一个仅适用于我当前使用当前显示器的机器的 hack。

我想用 dwm 应用的乘数替换“2”。

0 投票
1 回答
1082 浏览

c# - Windows 10:SetProcessDpiAwareness 无效

我的操作系统是 Windows 10 企业版。

[assembly: DisableDpiAwareness] 在 AssemblyInfo.cs 中设置

我将 SetProcessDpiAwareness() 设置为 PROCESS_PER_MONITOR_DPI_AWARE = 2 并返回 S_OK = 0。

之后,我调用 GetProcessDpiAwareness() 并返回 PROCESS_DPI_UNAWARE = 0。

为什么 GetProcessDpiAwareness() PROCESS_DPI_UNAWARE 以及为什么我的进程没有响应 DPI 调用?我该如何调试这个问题?

0 投票
2 回答
1210 浏览

winforms - 设置/缩放控件滚动条的宽度

当每个监视器的 DPI 更改(WM_DPICHANGED消息)时,列表视图、树视图、富编辑、列表框等控件的内置滚动条不会缩放(如预期的那样)。

未缩放的滚动条

它们需要以编程方式进行扩展。

虽然我没有找到任何 API(在 Win32 中也没有,只在 WinForms 中)来设置滚动条大小。

我可以使用什么 API 来设置滚动条大小(宽度)?

或者至少我如何获得滚动条句柄?(我假设滚动条内部是单独的子控件)一旦我有了句柄,我假设我可以MoveWindow用来调整它的大小(编辑:我的假设是不正确的,正如@Anders 的回答所示)


有关背景信息,请参阅Windows 上的高 DPI 桌面应用程序开发


有几个看似重复的问题,但实际上没有一个是相关的:

那里的答案要么更改系统范围的设置,要么DataGrid仅适用于(在其界面中具有单独的子滚动条控件)。

0 投票
1 回答
788 浏览

winforms - 每个显示器 DPI 感知 Windows 系统图像列表

如何检索给定 DPI 的系统图像列表?

当应用程序是系统 DPI 感知时,SHGetFileInfo和类似的函数将句柄返回到正确缩放的系统图像列表。C++ 示例:

但是对于每个显示器的 DPI 感知,这还不够,因为应用程序可以在不使用系统 DPI 的显示器上运行(或者应用程序可以有多个窗口,每个窗口在不同的显示器上,具有不同的 DPI)。

例如,在 168 DPI(175% 缩放)显示器上,使用标准 96 系统 DPI,您会看到未缩放的 16x16 小图标:

未缩放的系统图标

所以我希望,SHGetFileInfo(或类似的)有一个 DPI 感知变体,就像其他功能的 DPI 感知变体一样: