windows-vista - DWM 和绘画无响应的应用程序

标签 windows-vista dwm

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

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

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

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

问题照片;屏幕截图无法捕捉到效果(请注意,白色对话框的缓冲区发生了偏移——它的偏移正好是它与主(蓝色)窗口的偏移距离):

Unresponsive app

最佳答案

这是标准行为;当它们卡住时,您还可以在 Office 2007/2010 中注意到它。

关于windows-vista - DWM 和绘画无响应的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2471498/

相关文章:

windows - 如何从 Windows Vista Complete PC 备份中提取文件?

在 Terminal Linux 中像 gcc 一样在 CMD 中编译 .c 程序?

C++ WinAPI 使用 DWM 在自定义窗口框架上显示位图

windows-7 - 如何将 UAC 盾牌图标添加到仍然必须以 XP 为目标的程序中?

ruby-on-rails - Windows 上的 Rails 太慢了(rails -v 需要 4 秒)

button - 如何在不扩展非客户区的情况下在 Aero 主题标题栏上绘制自定义按钮?

c++ - 窗口区域、移动的子对象、DWM 以及它可以创建的白色 block 状困惑

mfc - 如何正确捕获 Aero/DWM 上的特定窗口

java - 使用 JNA (Java) 进行 Windows 缩略图预览

c++ - 删除 C++ Win32 中的标准窗口框架