0

我继承了一个现在必须在 Windows 10 上运行的遗留应用程序。在测试期间,我们发现程序的一部分(它是作为工具栏放置的子窗口)在程序启动时只会部分绘制——超过一半的工具栏的右侧只会绘制黑色。在运行时,修复是调整整个窗口的大小,这将调整/重绘工具栏窗口的大小。我们最终发现,如果我们设置“禁用显示缩放”似乎可以完全防止该错误(到目前为止测试的置信度刚刚超过 1 万分之一,这对我来说已经足够了)。

问题是:

这个错误的发生概率可能在 1/12 到 1/20 之间(我从我们对程序的自动测试的视频中确定,其中涉及 185 次错误发生的机会。没有发现发生的模式)。我从来没有处理过这样的错误,所以我想知道:鉴于错误的明显随机性和修复,发生了什么?Windows 为“高 DPI”而升级的位图渲染与布置工具栏的功能之间的竞争条件?

4

1 回答 1

1

Windows 10 扩展了 DPI 感知的概念。以前,DPI 感知是针对每个进程的设置,但现在它是针对每个线程的概念。MSDN 文档的措辞现在有点难以解读,但听起来像调用 SetProcessDPIAwareness(我希望遗留应用程序正在这样做)只影响调用线程(尽管名称中有“进程”)。

理论#1:也许您的工具栏窗口有时是在具有 DPI 意识的线程上创建的,有时它是在不同的线程上创建的。

理论 #2:调用 SetProcessDPIAware 的应用程序和一些缓存显示指标的 UI 代码之间存在竞争,该指标稍后用于绘制工具栏窗口。根据谁赢得比赛,您可能会得到不正确的行为。

文档建议较旧的应用程序(又名遗留应用程序)使用清单设置为整个过程设置 DPI 感知。我相信这将确保该设置应用于进程中的所有线程,并且应该在任何用户代码运行之前发生,因此不应该存在竞争。由于禁用缩放似乎可以解决问题,并且设置 DPI 意识应该大致等同于(实际上),如果任何一个理论都是正确的,我希望它能解决问题。

SetProcessDpiAware的文档解释了如何使用清单设置 DPI 感知。

于 2017-05-18T22:10:27.683 回答