问题标签 [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 回答
475 浏览

winapi - DX11设置全屏状态后桌面分辨率奇怪

我有一个 DPI Aware 应用程序(通过清单文件),并且在 1 个监视器系统上,以下所有方法都返回错误的桌面分辨率:

  • 获取系统指标
  • 获取监控信息
  • GetWindowRect(GetDesktopWindow(), &desktop)
  • EnumDisplaySettingsExA/ENUM_CURRENT_SETTINGS
  • IDXGIOutput::GetDesc

我的显示器是 4k,但我将桌面尺寸设置为 1920x1080,比例为 100%。在窗口模式下,通过所有方法报告的分辨率都是正确的。但是,当切换到全屏时,它们都返回 1600x1200。如果是 DPI Aware 问题,它至少应该保持纵横比,例如 1600x900。

我注意到错误的结果是在调用 IDXGISwapChain::SetFullscreenState(true, output_device) 之后根据 MSDN 使用标志 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH 创建交换链对象的。

该应用程序使用 DirectX 11。

有什么建议是我的原因吗?

谢谢

0 投票
1 回答
170 浏览

windows - Windows Server 是否支持 Per-Monitor v2 Awareness?

我正在为我们的应用程序编写系统要求,我们最近在其中添加了对每监视器 DPI 感知 V2 的支持。我们已经使用 Windows 的客户端版本对其进行了测试。有人知道 Windows Server 版本是否支持此功能,如果支持,从哪个版本开始?

我查看了 MSDN 但找不到答案...

如果它很重要,我们使用此处描述的方法初始化 DPI 感知: WPF ClickOnce DPI 感知 Per-Monitor v2

0 投票
1 回答
314 浏览

c# - 如何使用窗口缩放处理 SendInput 鼠标移动?

所以我找不到任何东西可以帮助我解决这个问题,这让我发疯了。

使用Windows Input Simulator (C# SendInput Wrapper - Simulate Keyboard and Mouse)

当我的软件的用户碰巧有一个非标准的 100% 窗口缩放InputSimulator.Mouse.MoveMouseTo(toX, toY);被抛出,移动到一个不正确的位置。

我目前的计算方式:

例如,如果用户将缩放设置为 125%,我将如何计算正确的 100% 缩放位置?

提前致谢。

0 投票
1 回答
195 浏览

windows - 稍后更改组合框的项目高度(用于 DPI 感知)

背景:

我有一个具有每显示器 DPI 感知模式的 MFC 应用程序。当我将窗口转移到另一个具有另一个屏幕缩放比例的监视器时,我会接收并处理该WM_DPICHANGED_AFTERPARENT消息。

我的所有者绘制的组合框(带有 style CBS_OWNERDRAWFIXED)已经填充了我需要根据新的缩放因子更新高度的项目。为此,我计算新高度并调用:

问题:在以前的缩放中尚未打开的组合框,但在更改项目高度后打开的组合框出现错误。列表以所有条目的后半部分打开,下半部分为空。关闭并重新打开它可以解决问题。

我尝试了从其他更新问题(例如,显示和隐藏组合框)中知道的解决方法Invalidate(),但它没有帮助。完全重新填写所有条目有效,但这很慢并且会导致闪烁(我在那个窗口中有 12 个这样的框)。

任何想法?谢谢!

编辑:问题显然只发生在增加项目的高度时(所以当我的窗口从 100% 移动到 200% 监视器时)。

0 投票
1 回答
400 浏览

c++ - 设置我的应用程序 api 感知并防止系统使其模糊和错误定位

我有一个带有父窗口和 4 个子窗口的简单应用程序。它看起来很好Windows xp并显示设置Windows 7125%

然而,在Windows 7不止125%Windows 10 125%本身上,窗口、菜单、文本和消息框变得模糊,并且子窗口被溢出。

我想修复它们,使它们看起来很好,所以我尝试根据 dpi 用更新的尺寸替换它们的尺寸:

但是,结果是一样的。

我还更改Compressor Reporter.exe.embed.manifest并在其中添加application标签,如下所示。但是当我重建我的应用程序时,我添加的内容没有出现,我看到没有application标签。

我做错了什么,如何修复模糊的窗口、文本、菜单和消息框并使子窗口正确定位?

谢谢

0 投票
0 回答
115 浏览

wpf - 每个监视器的 WPF DPI 感知对话框定位问题

我有一个 WPF .Net 4.7 应用程序,每个监视器都有 DPI Aware。我按照此处解释的解决方案启用 DPI 意识。

我想在主窗口的左上角打开一个对话框,然后执行以下操作:

我有 2 台具有不同 DPI 比例的显示器。

如果我从 Visual Studio 运行应用程序,一切正常:无论主窗口是哪个监视器,对话框始终位于主窗口的左上角。

但是,如果我从 Windows 资源管理器运行应用程序,则对话框仅在我启动应用程序时 Windows 资源管理器所在的监视器上正确定位。

为什么会出现这种不同的行为,以及当我从 Windows 资源管理器运行应用程序时如何正确定位对话框?

0 投票
0 回答
159 浏览

java - Java Runtime 7u51 不支持 DPI?

我们有一个 Java Web 应用程序(外部且不受我们管理),它在 Win 10 的 IE11 中使用 jp2launcher.exe 运行,但在高 DPI 设备上字体显示太小。我尝试了很多方法让它看起来更好,但似乎没有任何效果?

我试过(我们使用的是 7u51 x86):

  • 在浏览器中更改缩放选项,并在操作系统本身上缩放
  • 将 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifests 设置为 DWORD 1,并创建 java.exe.manifest、javaws.exe.manifest、javaw.exe.manifest 和 jp2launcher.exe.manifest。我通过使用资源浏览器获取原始清单并将 DpiAware 更改(或添加)为 true 来创建清单。

  • 我右键单击每个文件的属性,转到兼容性选项卡,更改高 DPI 设置并设置为覆盖系统(或系统/增强)。

  • 我不相信清单文件甚至被读取。所以我重新启动,但没有奏效。我更新了 exe 时间戳(http://csi-windows.com/blog/all/27-csi-news-general/245-find-out-why-your-external-manifest-is-being-ignored)并且没用。然后我决定编辑内部清单并将 DpiAware 设置为 false,但这也不起作用。

  • 我还检查了任务管理器,以确保我正在为正确的进程/可执行文件创建清单。我相信 DpiAware 已在 JRE9/10 9(?)中得到修复,但 Web 应用程序似乎仅适用于 x86 JRE,版本 9 及更高版本仅适用于 x64!

任何建议表示赞赏。我难住了。

0 投票
0 回答
93 浏览

wpf - 对 WPF 和 Winform 中“Screen.Bounds”的返回感到困惑

我有两个显示器(1:3840X2160 200% 比例,2:1280X1024 100% 比例)

他们的样子

然后我写一些东西来获得我的屏幕分辨率。

混乱来了。

TEST1:在 Winfrom 中,我得到了输出

1280,1024 1920,1080

TEST2:在 WPF 中,它显示

2560,2048 3840,2160

TSET3:检查 dpi Winform:96 WPF:192

这是我的问题:

  1. 为什么剂量 Winform\Wpf 返回不同的分辨率/DPI?
  2. 显然来自 wpf 的 '2560,2048' 是不正确的,但是为什么 wpf 返回 '1280X1024 * 200%' 呢?
  3. 如何从 winform 和 wpf 获得相同的输出?
0 投票
1 回答
609 浏览

winapi - 设置进程 DPI 感知,以便系统补偿缩放因子

我有以下鼠标钩子程序(为解释而简化)。

我从钩子中获得的鼠标坐标不会由显示器的缩放因子调整。
无论我将显示器的缩放系数设置为 100% 还是 200%,鼠标钩总是给我物理像素。

另一方面,GetCursorPoswinapi 函数以逻辑像素给出坐标。即如果缩放因子为200%,GetCursorPos将给出除以2的坐标,而鼠标钩将给出未调整的数字。

据此:
https ://docs.microsoft.com/en-us/windows/win32/api/shellscalingapi/ne-shellscalingapi-process_dpi_awareness

如果程序支持 DPI,系统会补偿缩放因子,以便程序继续工作,就好像什么都没发生一样。

这正是 . 的返回值所发生的情况GetCursorPos。它提供逻辑像素而不是物理像素。

另一方面,鼠标钩子程序没有被系统调整。

我尝试在清单中将我的程序设置为不支持 DPI,如下所示:

但这没有什么区别。我还尝试将其声明为可识别 DPI,如下所示:

这也没有任何区别。

是否有任何设置可以通过清单或其他方式添加到我的程序中,这将使鼠标钩子程序能够提供逻辑坐标GetCursorPos

我正在 Windows 10 中测试所有这些。


跟进:

我发现了问题。我的清单文件不正确。XML 命名空间未正确设置。

这是有效的。

为了让系统为程序提供逻辑坐标,程序必须是 DPI 感知的。没有表现出 DPI 感知能力的程序将处理不一致的坐标,不仅在鼠标钩子中,也在 BitBlt、IAccesibility、UIAutomation 等中。

我不明白为什么微软决定倒退。没有表现出 DPI 意识的程序应该像往常一样运行,而不是相反。

这意味着无论何时在监视器上设置缩放因子,大多数程序都会默认中断。为了破解它们,它们必须具有 DPI 意识,并且......就像那样......它们将再次工作。

0 投票
0 回答
450 浏览

c# - 在没有清单文件的情况下设置 PerMonitorV2 DpiAwareness?

在没有清单文件的情况下执行时,我的 Winforms 应用程序显得非常模糊。有了它和添加的代码

模糊确实消失了,但它需要用户有一个额外的 .config 文件才能使应用程序在运行时看起来清晰。我尝试将表单的 AutoScaleMode 变量设置为 Font 和 Dpi,但两者都没有区别。我也在网上找到了这个SetProcessDpiAwarenessContext功能,但我不确定这是否是我正在寻找的,我不知道如何在我的代码中实现它。

是否可以在没有清单文件的情况下从我的应用程序中消除模糊?