我们都知道这种情况,当程序或操作系统本身冻结时,您唯一能做的就是使用系统呈现的数百万个对话框进行绘制。我说的是这个(演示在这里):
为什么会发生这种情况?为什么我总是只在 Windows XP 上遇到它?这不会发生在 Linux、Mac 或其他 Windows 版本上吗?如果没有,为什么?实际上,这个错误有正式/通用名称吗?
答案1
这就是所谓的“鬼窗”。发生的情况是,进程挂起或死锁,因此无法响应绘制消息来更新其窗口。为了处理这种情况,Windows 接管并绘制窗口,直到程序再次响应并自行绘制(或被终止或崩溃)。
在旧版本的 Windows 中,冻结的窗口会用其背景色进行绘制,但在 XP 中,Windows 会截取上次更新时的窗口截图,并使用该截图进行绘制。当然,如果窗口的某些部分被遮住(例如,如果您将其拖出屏幕),则 Windows 只能用背景色进行绘制(这就是为什么将其拖出屏幕后,窗口会完全空白的原因)。
此外,当您拖动其他在其上放置窗口,它们会留下痕迹,因为当部分窗口被揭开时,冻结的窗口不会响应绘制消息。
在 Vista+ 中,Windows 仍像在 XP 中一样绘制重影窗口,但它使用了一种技巧,使窗口看起来仍然在某种程度上是活的;您仍然可以移动和最小化它,而不会丢失上次更新的图像或获得镜厅效果。它现在所做的是隐藏实际冻结的窗口,并用一个与冻结窗口大小和形状相同的新临时窗口替换它。新窗口用冻结窗口的屏幕截图绘制,但带有淡白色。现在,当您将其他窗口拖到它上面时,它会保留原始(重影)图像,因为它实际上并未冻结;它通过绘制存储的屏幕截图来处理绘制消息。
当然,Mac,Linux等都以自己的方式处理窗口绘制和管理,因此它们对冻结窗口的反应方式不同。