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

c# - 如果标记为 DPI 感知并与多个监视器一起使用,Winforms 应用程序将引发 Win32Exception

我有一个以 aTabControl tabControl作为主要对象的 Windows 窗体应用程序(.NET Framework 4.8)。我用它来切换到不同的屏幕,并且我有一个下一个上一个按钮,可以使用以下代码选择下一个或上一个选项卡:

我通过在以下内容中包含以下内容将我的应用程序设置为 DPI 感知app.config

在最后一个选项卡上,我有一个 DataGridView。如果我使用按钮准确地转到最后一个选项卡两次,无论我单击按钮的速度有多快,我都会收到以下异常:System.ComponentModel.Win32Exception: 'Error creating window handle.',并且它似乎是在SelectTab方法中抛出的。如果我将 SelectTab 替换为tabControl.SelectedIndex = index + 1.

app.config但是,如果我使用 TabControl 的选项卡多次删除标签或导航到选项卡,则不会发生这种情况。我在第二台显示器上以 100% 缩放创建并运行应用程序,但如果我在笔记本电脑主屏幕上以 125% 缩放运行它,则不会发生问题(尽管有趣的是,应用程序始终以 100% 启动,直到出现 DPI 更改事件通过将应用程序从一个屏幕移动到另一个屏幕来触发)。我只能在我的 100% 屏幕上重现这个问题,而从来没有在我的 125% 屏幕上重现这个问题。如果我将主屏幕上的缩放设置为 100%,问题就会消失,如果两个屏幕都设置为 125%,我也无法重现它。

我找不到有关此问题的任何信息。有没有办法防止它?

异常信息的图像,几乎没有任何有用的信息


更新:我尝试设置DataGridView.DisableHighDpiImprovements"false",但没有解决


更新 2:完整的堆栈跟踪(图像仅显示第一位):

作为参考,这是 datagridview 的样子(删除了标题中的文本),右侧的按钮不是 datagridview 的一部分,而是用于控制当前选定的行。

在此处输入图像描述


更新 3:创建新项目时我无法自己复制它。以不同的 DPI 值(100% 和 125%)重新启动并没有帮助。我发现第一次点击下拉菜单的背景是黑色的。如果将鼠标悬停在某个选项上,它将显示为正常突出显示的选项(蓝色背景和白色文本),直到我再次离开它。这发生在两个屏幕上。

黑色下拉菜单

我还发现,如果我将光标放在 placeholder 的两个文本字段中DataDridViewRow,则不会发生异常。将光标放在其中一个文本字段中后,文本字段本身就像下拉菜单一样显示为黑色,但只有一次(与下拉菜单不同),然后下拉菜单和其他文本框不再是黑色的。这表明占位符行有问题,但我不知道是什么,也不知道它与不同的 DPI 问题有何关系。其中一列还有一个很长的工具提示,我认为可能会导致问题,但删除它什么也没做。


更新 4:如果在表单设计器中将 DataGridView 的 Visible 属性设置为 false,则不会发生错误。这似乎将问题限制在与 DataGridView 和多个屏幕上的不同缩放相关的问题上。我还尝试以编程方式在占位符行的两个文本字段中设置文本,但没有成功。

0 投票
1 回答
240 浏览

c++ - 每个监视器 DPI 感知 MFC MDI 应用程序的问题

我正在努力使 MFC 应用程序在具有不同 DPI 缩放的多个监视器环境中正确显示。当主显示器和辅助显示器以不同的 DPI 运行并且应用程序位于辅助显示器上时,我无法解释一个问题。

如果主显示器具有 100% DPI 缩放 (96) 而辅助显示器具有相同的 100% DPI 缩放,则一切正常。

如果主监视器具有 100% DPI 缩放 (96) 而辅助监视器具有 125% 缩放 (120 DPI) 或 150% 缩放 (144 DPI) 或任何其他更高的值,则当子窗口最大化时,子窗口系统的一部分bar 是可见的,如下所示:

125% 缩放: 在此处输入图像描述

150% 缩放: 在此处输入图像描述

如果你仔细看,它的 125% 为 7 个像素,150% 为 14 个像素。假设系统栏在 100% 缩放时为 29 像素,在 150% 时为 36 和 125%,以及 43,这 7 和 14 像素分别是 125% 和 150% 时栏大小与 100% 时的高度差基线。

因此,条形图的位置和大小似乎是由系统在主监视器上运行时计算的。

当您最大化子窗口时,会向窗口发送一系列 Windows 消息:WM_GETMINMAXINFO> WM_WINDOWPOSCHANGING> WM_GETMINMAXINFO> WM_NCCALSIZE> WM_WINDOWSPOSCHANGED> WM_MOVE> WM_SIZEWM_GETMINMAXINFO当窗口的大小或位置即将改变时发送,以便应用程序可以覆盖,例如,窗口的默认最大化大小和位置。对此有一个注释:

对于具有多个监视器的系统,ptMaxSize 和 ptMaxPosition 成员描述了主监视器上窗口的最大化大小和位置,即使窗口最终在辅助监视器上最大化。在这种情况下,窗口管理器会调整这些值以补偿主监视器和显示窗口的监视器之间的差异。因此,如果用户保持 ptMaxSize 不变,则监视器上大于主监视器的窗口将最大化为较大监视器的大小。

Raymond Chan 有一篇文章,对此进行了解释:窗口管理器如何为多个显示器调整 ptMaxSize 和 ptMaxPosition?.

所以ptMaxSize应该填写主显示器的尺寸。我的主显示器是 2560x1440 像素,辅助显示器的尺寸是 1920x1200。但是,我在这里得到的尺寸值是 1757x1023 和 1761x1027(在连续调用时)。这既不是主监视器的大小,也不是辅助监视器的大小。

我试图做一个肮脏的把戏并处理WM_NCCALCSIZE消息并将位置(左,上)设置为 0(相对于父级)。

只要子窗口具有焦点,就可以正常工作。如果我单击另一个窗口并且它失去焦点,则该栏将重新绘制并显示在先前的位置。这个技巧只是说客户区域从哪里开始,所以当非客户被重绘时,我会回到原来的问题。

我的问题是这个问题的根源是什么,我该如何尝试解决它?

0 投票
1 回答
54 浏览

python - 为什么我在 Python 中打开 DpiAwareness 后无法关闭它?

我使用此代码在 Win10 下的 Python 2.7 中打开 Dpi Awareness

不会关闭它。我正在寻找任何建议。

0 投票
0 回答
37 浏览

c - 在visual studio代码上设置“Per Monitor DPI Aware”?

我正在尝试使用 VS 代码创建一个 Windows 应用程序,因为我无法弄清楚如何使用 VS 2019。我知道您应该在您正在使用的应用程序的清单中设置 dpi 感知,但我在VS 代码。还有另一种方法可以在代码文件中或在 vs 代码之外进行设置吗?谢谢你的帮助

0 投票
0 回答
38 浏览

.net - DirectShow 没有视频预览图像

我有一个多年前编写的旧 .Net 应用程序,其中包括一个视频预览窗口。这使用名为 DirectShowLib-2005.dll 的第 3 方库。我的代码基于我在网上找到的从 c# 转换为 Vb.net 的一些示例代码。基本上它只是设置一个简单的捕获图并使用 SampleGrabber 将视频流链接到窗体上的 PictureBox 控件。

这在世界各地的各种用户中都运行良好,但最近我们有几个新用户报告说没有显示图像。起初我们认为这可能是相机驱动程序的问题,但我可以看到视频数据正在通过内存缓冲区。

我很难调试,因为我无法访问任何机器来显示问题。我确实有一台笔记本电脑显示出稍微不同的问题。它确实显示了图像,但仅显示了图像的一部分。看起来它被错误地居中了。我发现将 Windows 显示设置中的文本缩放更改为 100% 可以解决此问题。但是,这并不能解决其他用户报告问题的问题,他们看到的是灰色背景,而不是我看到的黑色背景。

我的老板在他的笔记本电脑上遇到了问题。我们发现在应用程序快捷方式属性中将兼容性设置中的缩减颜色模式设置为 8 位可以解决他的问题。

我正在尝试将代码的基本部分提取到一个单独的测试应用程序中,以便我可以更好地调试它,但我想知道这是否是现代 PC 的已知问题,或者可能是某些显卡或显示驱动程序的问题?

谢谢

菲尔

0 投票
0 回答
8 浏览

mshtml - 系统 dpiawareness 导致 webhost 表现为 dpi 感知

我在我的应用程序的应用程序清单中添加了系统 dpiawareness。系统

该应用程序还使用 IE 控件托管网页。我面临的问题是,网页以 8k 分辨率拉伸。

系统 dpiawareness 是否也使主机具有 dpi 意识?如果是,那为什么我只以 8k 分辨率观察它。

0 投票
1 回答
27 浏览

visual-c++ - VC++08 在不更新 VC++ 的情况下使 MFC 应用程序能够识别 DPI

我可能无法像理想的那样简单地更新到更新的 VC++ 版本 - 项目很大,更新可能会破坏很多东西,而且我的领导可能会告诉我不要追求这个。我想知道是否有人知道使用 VC++08 编写的 MFC 应用程序可以在运行时检查分辨率的方法?

0 投票
0 回答
138 浏览

wpf - 仅在 WPF 应用程序中为 CefSharp 窗口设置 DPI 缩放

我正在尝试将 IE Web 浏览器窗口转换为 CefSharp (v 96.0.180) 窗口作为更大 WPF 应用程序的一部分。应用程序本身遵循系统 dpi 级别(使用它调整 UI 大小),但无论系统设置如何,IE 窗口都保持 100% dpi。​当我将控件转换为 CefSharp 时,它会开始跟随系统 dpi。问题是页面在任何超过 100% 的 dpi 上都被放大且丑陋。

为了检查 Cefsharp 窗口行为,我尝试使用应用程序清单将 dpi 感知设置为 true 或 per monitor,但它不起作用(而且我担心它会为整个应用程序设置它,而我只需要它对于一个窗口/项目)。

有没有办法实现它?

编辑:每个请求的代码:BrowserView.xaml:

BrowserView.xaml.cs:

(我还尝试将这些调用移动到我在 CefSharp wiki/GeneralUsage 中创建的 App.xaml.cs Main 方法。这些是 Main 中的第一个调用。没有效果,无论我作为命令行参数放什么。)

在加载控件时触发的事件的事件处理程序中的同一 BrowserView.xaml.cs 文件中:

总之,如果我将系统设置切换为 DPI 100% 并重新运行应用程序,上述任何操作都不会使窗口看起来像它的样子(而这种外观正是我所需要的)。

0 投票
0 回答
59 浏览

c# - 如何在C#的辅助显示器上的指定位置打开一个弹出窗体?

更新
这个问题是从这里的延续。

我正在为开源文本编辑器开发自定义上下文菜单,上下文菜单是使用Form. 我将上下文菜单类命名为ContextMenu.

下面是一个函数(答案取自上一个问题),负责设置弹出表单的位置。在其中可以找到防止表单打开超出工作屏幕区域的逻辑。

其他一些相关代码,以防万一需要参考:

问题是当我尝试调用要在辅助显示屏上显示的上下文菜单时,它只在主显示屏上弹出,而在辅助显示屏上没有。

根据上一个线程给出的答案,我尝试启用称为 DpiAware 或 DpiAwareness 的东西。例如,我编辑了 app.manifest 或 app.config(我编辑的文件的参考可以在这里找到),希望能解决这个问题。但是,它仍然没有解决任何问题。

我不确定的是,DpiAware单独启用是否可以解决此问题,还是我需要添加其他内容?

请注意,与前一个线程给出的答案相比,我所做的代码实现有点不同,因为我是根据程序的需要对其进行编码的。换句话说,这是为了确保从答案中插入的新代码适应程序中的现有代码。为此,我相信它不会改变或影响上一个线程答案中的代码的工作方式。