2010-07-22 4 views
3

내 앱에는 화면 이미지를 캡처하기 전에 DwmEnableComposition (0)을 호출하여 에어로를 비활성화 할 수있는 옵션이 있습니다. 아시다시피 에어로를 비활성화하면 화면이 검게 변한 후 정상으로 돌아갑니다. 다른 PC에서는 시스템 속도에 따라 2-3 초가 걸릴 수 있습니다.비활성화 에어로가 완료 될 때까지 대기

Aero가 Thread.Sleep() 대신 화면 캡처 전에 완전히 비활성화되었는지 확인하는 더 좋은 방법이 있습니까?

답변

1

양식의 그림판 이벤트가 실행됩니다. 그렇다고해서 모든 창문이 완전히 채워지는 것은 아니지만 잠잘 수는 없습니다. WndProc()를 재정 의하여 알림 메시지를 수신하면 작동 여부를 알 수 없습니다. WM_DWMCOMPOSITIONCHANGED 메시지 0x31e입니다. 너무 빨리 보내질 것 같아요, 모든 창은 아마도 다음에 다시 칠해야합니다. 유일한 방법은 EnumWindows로 창을 열거하고 UpdateWindow를 호출하는 것입니다. 필요한 P/Invoke 선언은 pinvoke.net을 방문하십시오. 수면()도 효과가 있지만 어느 곳에서나 사용할 수있는 양을 추측 할 방법이 없습니다.

+0

WndProc에서 WM_DWMCOMPOSITIONCHANGED는 에어로가 완전히 비활성화되지 않았 음을 보장하지 않습니다. 화면의 일부가 여전히 검은 색입니다. – sjlewis

+0

에어로가 아직 비활성화되지 않은 것은 아닙니다. 왜냐하면 창문이 아직 다시 칠할 기회가 없었기 때문입니다. 소식이 업데이트되었습니다. –

2

관련 API 함수 DwmIsCompositionEnabled을 사용하여이를 수행 할 수 있어야합니다. 다른 옵션은 WM_DWMCOMPOSITIONCHANGED 이벤트를 수신하는 것일 수 있습니다.

+0

에어로를 비활성화 한 후 루프에서 DwmIsCompositionEnabled를 이미 확인하고 있지만 화면 캡처는 에어로가 완전히 비활성화되기 전에 계속 진행되므로 흑백 이미지가 표시됩니다. WM_DWMCOMPOSITIONCHANGED 시도합니다. – sjlewis