我的应用程序有一个选项,可以在捕获屏幕图像之前调用DwmEnableComposition(0)来禁用aero。正如你所知道的,禁用aero会使屏幕变黑,然后恢复正常。在不同的PC上,这可能需要2到3秒,具体取决于系统的速度。
有没有更好的方法来确定在截屏之前aero是否已经完全禁用而不是Thread.Sleep()?
发布于 2010-07-22 20:17:18
窗体的Paint事件将运行。这并不意味着所有的窗口都会被完全粉刷,但你可以少睡一会儿。通过覆盖WndProc()来侦听通知消息可能会起作用,但不能确定通知消息的发送时间。WM_DWMCOMPOSITIONCHANGED是消息0x31e。我怀疑它会发送得太快,所有的窗口都可能不得不重新粉刷自己。确保这一点的唯一方法是使用EnumWindows枚举窗口并调用UpdateWindow。访问pinvoke.net获取您需要的P/Invoke声明。Sleep()也会起作用,但无法猜测保证在任何地方都能起作用的数量。
发布于 2010-07-22 20:13:05
您应该可以使用相关的接口函数DwmIsCompositionEnabled来完成此操作。另一种选择可能是侦听WM_DWMCOMPOSITIONCHANGED事件。
发布于 2010-07-22 20:15:07
你调查过DwmIsCompositionEnabled吗?该页面还表示,应用程序可以通过处理WM_DWMCOMPOSITIONCHANGED通知来监听组合状态的更改。
https://stackoverflow.com/questions/3308614
复制相似问题