DWM和绘制无响应的应用程序

时间:2010-03-18 16:19:50

标签: windows-vista dwm

在Vista及更高版本中,如果应用程序无响应,桌面窗口管理器可以在必要时处理重绘(在窗口上方移动窗口,拖动它等),因为它为其保留了像素缓冲区。 Windows还尝试检测应用程序在超时后变得无响应的时间,并尝试充分利用这种情况 - 我相信它会使窗口变暗,在其标题栏中添加“无响应”,以及其他一些其他效果。

现在,我们有一个使用窗口区域和分层窗口的皮肤应用程序,它不能很好地利用这些效果。我们一直在开发XP,但是在Vista上测试时发现了一个奇怪的效果。在某些时候,应用程序可能会花费一些时间进行某些计算或回调,并且“如果在5秒内未检索到消息,则DWM将声明窗口挂起”(MSDN - Preventing Hangs in Windows Applications)。似乎当这个问题开始时,会出现一个奇怪的图形问题:由于窗口区域变黑,任何100%透明的像素都会变黑,这有效地使窗口呈矩形,背景为黑色。似乎存在其他异常现象,原始窗口的像素在某些子对话框中稍微移位。

我正在努力减少这种延迟(理想情况下Windows永远不需要像这样进入),并且在忙碌时尝试保持响应能力,但我仍然想知道是什么导致它像这样渲染,因为我不能保证我可以消除所有延误。

基本上,我只想知道Windows发生了什么,以及如何使我的应用程序正常运行。皮肤应用程序必须仍然可以在Vista及更高版本上运行,所以我需要弄清楚我正在做什么,这是非标准的。我甚至不知道如何查找Windows现在如何处理无响应的应用程序的信息,因为我的搜索仅返回那些没有响应的应用程序问题的人,或者对DWM对这些应用程序做什么的非常基本的解释。哎呀我甚至不确定这是DWM的责任,但似乎很可能。任何潜在的潜在客户?

问题照片;屏幕截图不会捕获效果(请注意,白色对话框的缓冲区已移位 - 它正好偏离了从主(蓝色)窗口偏移的距离):

Unresponsive app http://i42.tinypic.com/15ee8wo.jpg

3 个答案:

答案 0 :(得分:0)

这是标准行为;您可以在Office 2007/2010冻结时注意到它。

答案 1 :(得分:0)

我发现它在执行此操作时被称为“重影”,并且它是在XP中引入的(尽管看起来DWM更进了一步,因为它跟踪每个应用程序的像素)。可以使用DisableProcessWindowsGhosting()在应用有效期内禁用它。有些人说它不推荐,但考虑到它与分层窗口有多么糟糕,关闭它的缺点可以忽略不计。我已经对它进行了测试,它确实完全符合它的要求;现在,如果服务器需要比预期更长的时间返回,它将不会破坏整个界面。

如果有更好的方法让我的分层窗口能够使用Vista / 7处理重影而不会完全禁用它,我当然还是会感兴趣,但我可能只是接受这个作为答案。< / p>

答案 2 :(得分:0)

我认为基本上有两件事可以帮助解决这个问题:

首先,就像你一直在做的那样,尽量不要挂在第一位:在UI线程中做尽可能少的重担。

其次,不要使用多个顶级窗口来实现用户只能看到的内容;相反,自己做合成。这样可以防止图层彼此不同步。