我的应用程序有一个选项,可以通过调用DwmEnableComposition(0)来禁用Aero,以便在捕获屏幕图像之前。正如您所知,禁用Aero会使屏幕变黑,然后恢复正常。在不同的电脑上,这可能需要2到3秒,具体取决于系统的速度。
除了Thread.Sleep()外,是否有更好的方法确定Aero已完全禁用以进行屏幕捕获?
WM_DWMCOMPOSITIONCHANGED
事件。你的表单的Paint事件将会被触发。这并不意味着所有窗口都会完全绘制,但你可以少睡一会儿。通过重写WndProc()监听通知消息可能有效,但我不确定它何时被发送。WM_DWMCOMPOSITIONCHANGED是消息0x31e。我怀疑它会被发送得太早,所有窗口可能都需要重新绘制。唯一确定的方法是使用EnumWindows枚举窗口并调用UpdateWindow。访问pinvoke.net获取所需的P/Invoke声明。Sleep()也可以工作,但没有办法猜测一个在任何地方都保证可行的数量。