等待禁用Aero完成

3

我的应用程序有一个选项,可以通过调用DwmEnableComposition(0)来禁用Aero,以便在捕获屏幕图像之前。正如您所知,禁用Aero会使屏幕变黑,然后恢复正常。在不同的电脑上,这可能需要2到3秒,具体取决于系统的速度。

除了Thread.Sleep()外,是否有更好的方法确定Aero已完全禁用以进行屏幕捕获?

3个回答

2
您可以使用相关的API函数DwmIsCompositionEnabled来实现这个功能。另一个选项是监听WM_DWMCOMPOSITIONCHANGED事件。

我已经在禁用Aero后的循环中检查了DwmIsCompositionEnabled,但屏幕捕获仍然在完全禁用Aero之前进行,因此我最终得到黑色图像。 我将尝试使用WM_DWMCOMPOSITIONCHANGED。 - sjlewis

1

1

你的表单的Paint事件将会被触发。这并不意味着所有窗口都会完全绘制,但你可以少睡一会儿。通过重写WndProc()监听通知消息可能有效,但我不确定它何时被发送。WM_DWMCOMPOSITIONCHANGED是消息0x31e。我怀疑它会被发送得太早,所有窗口可能都需要重新绘制。唯一确定的方法是使用EnumWindows枚举窗口并调用UpdateWindow。访问pinvoke.net获取所需的P/Invoke声明。Sleep()也可以工作,但没有办法猜测一个在任何地方都保证可行的数量。


WndProc中的WM_DWMCOMPOSITIONCHANGED不能确保Aero已完全禁用。屏幕的某些部分仍然是黑色的。 - sjlewis
并不是Aero还没有被禁用,而是窗口还没有重新绘制。帖子已更新。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接