私のアプリには、画面イメージをキャプチャする前に DwmEnableComposition(0) を呼び出して aero を無効にするオプションがあります。ご存じのとおり、エアロを無効にすると画面が真っ暗になり、その後通常に戻ります。異なる PC では、システムの速度に応じて 2 ~ 3 秒かかる場合があります。
Thread.Sleep() の代わりにスクリーン キャプチャの前に aero が完全に無効になっているかどうかを判断するより良い方法はありますか?
関連する API 関数DwmIsCompositionEnabledを使用してこれを行うことができるはずです。WM_DWMCOMPOSITIONCHANGED
もう 1 つのオプションは、イベントをリッスンすることです。
フォームの Paint イベントが実行されます。すべての窓が完全に塗装されるわけではありませんが、睡眠時間は少なくて済みます。WndProc() をオーバーライドして通知メッセージをリッスンすると、通知メッセージがいつ送信されるかわからない場合があります。WM_DWMCOMPOSITIONCHANGED はメッセージ 0x31e です。送信が早すぎるのではないかと思います。おそらく、次にすべてのウィンドウを再描画する必要があります。確認する唯一の方法は、EnumWindows でウィンドウを列挙し、UpdateWindow を呼び出すことです。必要な P/Invoke 宣言については、pinvoke.net にアクセスしてください。Sleep() も機能しますが、どこでも機能することが保証されている量を推測する方法はありません。
DwmIsCompositionEnabledを調べましたか? このページには、 WM_DWMCOMPOSITIONCHANGED通知を処理することで、アプリケーションが構成状態の変更をリッスンできるとも書かれています。