在 Vista 及更高版本中,如果应用程序变得无响应,桌面窗口管理器能够在必要时处理重绘它(在其上移动窗口、拖动它等),因为它为它保留了一个像素缓冲区。Windows 还尝试检测应用程序何时在超时后变得无响应,并尝试充分利用这种情况——我相信它会使窗口变暗,在其标题栏中添加“无响应”,也许还有其他一些效果。
现在,我们有一个使用窗口区域和分层窗口的蒙皮应用程序,它不能很好地处理这些效果。我们一直在 XP 上进行开发,但在 Vista 上进行测试时发现了一个奇怪的效果。在某些时候,应用程序可能会花费一些时间进行一些计算或回调,并且“如果在 5 秒内未检索到消息,则 DWM 会声明窗口被挂起”(MSDN - 防止 Windows 应用程序中的挂起)。似乎当这开始时,出现了一个奇怪的图形问题:由于窗口区域而 100% 透明的任何像素变成黑色,这有效地使窗口再次变成矩形,具有黑色背景。似乎还有其他异常情况,原始窗口的像素在某些子对话框中发生了一些偏移。
我正在努力减少这种延迟(理想情况下,Windows 永远不需要像这样介入),并试图在它忙碌时保持响应能力,但我仍然想弄清楚是什么导致它呈现这样的,因为我可以不能保证我可以消除所有延误。
基本上,我只想知道 Windows 在发生这种情况时在做什么,以及如何使我的应用程序正常运行。皮肤应用程序必须在 Vista 和更高版本上仍然可以工作,所以我需要弄清楚我在做什么是非标准的。我什至不确切知道如何查找有关 Windows 现在如何处理无响应应用程序的信息,因为我的搜索只返回对无响应应用程序有问题的人,或者对 DWM 对此类应用程序的作用的非常基本的解释。哎呀,我什至不能 100% 确定是 DWM 负责,但似乎很有可能。有什么潜在的线索吗?
问题照片;屏幕截图不会捕捉到效果(请注意,白色对话框的缓冲区被移动了——它被移动了它从主(蓝色)窗口偏移的距离):