【问题标题】:DWM and painting unresponsive appsDWM 和绘画无响应的应用程序
【发布时间】:2010-03-18 16:19:49
【问题描述】:

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

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

我正在努力减少这种延迟(理想情况下,Windows 永远不需要像这样介入),并试图在它忙碌时保持响应能力,但我仍然想弄清楚是什么导致它呈现这样的,因为我不能保证我能消除所有的延误。

基本上,我只想知道 Windows 在发生这种情况时在做什么,以及如何使我的应用程序正常运行。皮肤应用程序必须在 Vista 和更高版本上仍然可以工作,所以我需要弄清楚我在做什么是非标准的。我什至不确切知道如何查找有关 Windows 现在如何处理无响应应用程序的信息,因为我的搜索只返回对无响应应用程序有问题的人,或者对 DWM 对此类应用程序的作用的非常基本的解释。哎呀,我什至不能 100% 确定是 DWM 负责,但似乎很有可能。有什么潜在的线索吗?

问题照片;屏幕截图不会捕捉到效果(请注意,白色对话框的缓冲区被移动了——它被移动了它与主(蓝色)窗口偏移的距离):

【问题讨论】:

标签: windows-vista dwm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我发现这样做时它被称为“重影”,它是在 XP 中引入的(尽管 DWM 似乎更进一步,因为它跟踪每个应用程序的像素)。可以使用DisableProcessWindowsGhosting() 在应用程序的整个生命周期内禁用它。有些人说不建议这样做,但考虑到它与分层窗口的搭配有多糟糕,关闭它的缺点可以忽略不计。我已经对其进行了测试,它完全符合它的要求;现在,如果服务器返回的时间比预期的长,它不会破坏整个界面。

    如果有更好的方法让我的分层窗口与 Vista/7 的重影处理一起工作而不完全禁用它,我当然仍然有兴趣,但我可能会接受这个作为答案。

    【讨论】:

    • 在 UI 线程上进行任何昂贵的计算或阻塞 I/O 都是错误的......
    • 当然可以。但我已经提到我一直在努力将一些东西从 UI 线程中移出,但无论如何都想深入了解另一个问题。
    • 嗯,是的,当窗口内容没有在应用程序挂起和 Windows 意识到它已经完成之间绘制其他线程窗口的一部分时,重影确实看起来更漂亮,因为他们倾向于不使用 DWM 将渲染重定向到特定于顶层窗口的帧缓冲区。 (主要是因为用户在 Windows 发现任何问题之前就已经决定“无聊了,让我们换个应用吧”)
    【解决方案3】:

    我认为基本上有两件事会对此有所帮助:

    首先,就像你一直在做的那样,一开始就尽量不要挂起:在 UI 线程中尽量少做繁重的工作。

    其次,不要使用多个顶级窗口来实现用户想要看到的只是一个;相反,请自己进行合成。这将防止图层彼此不同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多