等待禁用aero完成

时间:2010-07-22 12:06:37

标签: c# winforms aero dwm

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

是否有更好的方法可以确定在屏幕截图之前是否完全禁用了aero而不是Thread.Sleep()?

3 个答案:

答案 0 :(得分:2)

您应该可以使用相关的API函数DwmIsCompositionEnabled来执行此操作。另一种选择可能是监听WM_DWMCOMPOSITIONCHANGED事件。

答案 1 :(得分:1)

你有没有看过DwmIsCompositionEnabled?此页面还说应用程序可以通过处理WM_DWMCOMPOSITIONCHANGED通知来侦听组合状态更改。

答案 2 :(得分:1)

您的表单的Paint事件将会运行。这并不意味着所有的窗户都会被完全涂上,但你可以少睡一觉。通过覆盖WndProc()来监听通知消息可能有效,不确定何时发送。 WM_DWMCOMPOSITIONCHANGED是消息0x31e。我怀疑它会很快发送,所有窗口可能都要重新开始自己。唯一可以确定的方法是使用EnumWindows枚举窗口并调用UpdateWindow。访问pinvoke.net,获取您需要的P / Invoke声明。 Sleep()也会起作用,但没有办法猜测保证在任何地方工作的数量。