我继承了现在必须在Windows 10上运行的遗留应用程序。在测试期间,我们发现程序的一部分(作为工具栏放置的子窗口)只会在程序启动时部分绘制 - 超过工具栏右侧的一半只会绘制黑色。在运行时,修复程序是调整整个窗口的大小,这将调整/重绘工具栏窗口。我们最终发现,如果我们设置"禁用显示缩放"似乎完全防止了这个错误(到目前为止测试的信心超过了1万分之一,这对我来说已经足够了)。
问题是:
这个错误只发生在1/12到1/20的概率之间(我从我们对程序的自动测试视频中确定,这涉及到185个发生错误的机会。没有发现的模式)。我从来没有处理过这样的错误,所以我想知道:鉴于错误的明显随机性和修复,发生了什么?位图呈现之间的竞争条件,然后Windows升级为高DPI"和布局工具栏的功能?
答案 0 :(得分:1)
Windows 10扩展了DPI意识的概念。之前,DPI意识是一个每个进程的设置,但现在它是一个每线程的概念。 MSDN docs措辞现在有点难以破译,但听起来像调用SetProcessDPIAwareness(我希望遗留应用程序正在做)只影响调用线程(尽管"进程"在名称中)
理论#1:也许您的工具栏窗口有时是在具有DPI感知的线程上创建的,有时它是在不同的线程上创建的。
理论#2:app调用SetProcessDPIAware和一些缓存显示度量的UI代码之间存在争用,后者用于绘制工具栏窗口。根据谁赢得比赛,你可能会得到不正确的行为。
文档建议较旧的应用程序(例如遗留应用程序)使用清单设置为整个过程设置DPI感知。我相信这将确保该设置应用于进程中的所有线程,并且它应该在任何用户代码运行之前发生,因此不应该有竞争。由于禁用缩放似乎可以解决问题,并且设置DPI意识应该大致相当于(实际上),如果任何一种理论都是正确的,我希望能够解决问题。
documentation for SetProcessDpiAware解释了如何使用清单设置DPI意识。