3

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

有没有更好的方法来确定 aero 在屏幕捕获之前是否完全禁用而不是 Thread.Sleep()?

4

3 回答 3

2

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

于 2010-07-22T12:13:04.840 回答
1

你看过DwmIsCompositionEnabled吗?这个页面还说应用程序可以通过处理WM_DWMCOMPOSITIONCHANGED通知来监听组合状态的变化。

于 2010-07-22T12:15:07.193 回答
1

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

于 2010-07-22T12:17:17.920 回答