2014-11-04 2 views
2

사용자가 로그인되어 있고 다른 사용자로 로그 아웃하지 않은 경우를 상상해보십시오. 그런 다음 다시 전환합니다. 되돌아 왔을 때 (우리가 로그 아웃하지 않았기 때문에) Windows는 먼저 검은 바탕 화면을 표시 한 다음 일부 창이 깜박 거리며 (특히 2 개의 모니터로) 마침내 모든 것을 마지막 상태로 다시 정렬합니다. 그 깜박임과 재 배열에는 시간이 걸립니다 (대략 1 초).Hook to Win32 API 이벤트가 데스크톱이 완전히로드 될 때 알림을 받으십시오.

데스크톱이 완전히로드되었다는 알림을받는 가장 효율적인 방법은 무엇입니까? 바탕 화면이 완전히로드되면 특정 기능을 호출하기 때문에이 기능이 필요합니다.

하나의 옵션은 WM_PAINT에 연결하는 것이지만 Spy ++를 사용하면 바탕 화면에 12 WM_PAINT 이벤트가 발생하므로 신뢰할 수 없습니다. 누군가 다른 방법을 알고 있니?

+0

내가 API를 추적/ETW 추적을하고 메시지를 주위에 전달되는 관찰하여 추천 할 것입니다. 그 외에 [데스크톱 생성/전환과 상호 작용하고 후킹하는] API가 있습니다 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684303 (v = vs.85) .aspx) –

+0

@ JakeHeidt, 실제로 OpenInputDesktop을 시도하고있었습니다. 것은 바탕 화면이 입력 준비가되어 있지만 창문이 정렬되어 있지 않다는 것입니다. 바탕 화면의 모든 것이 준비되었을 때 전화해야하는 디스플레이 이중화 기능이 있습니다. 내가 더 빨리 호출하면 디스플레이 복제가 작동하지 않습니다. 수면을 2 초 동안두면 작동합니다. 것은 깜박 거리는 동안 이미 입력을 받아들이므로이 함수는 성공적으로 반환됩니다. – armanali

+0

@JakeHeidt DWM API의 DwmFlush()가이 경우에 훌륭하게 작동했습니다. – armanali

답변

2

훨씬 간단해진 해결책을 찾아 냈습니다. DwmFlush() 에의 호출입니다. 이 함수는 Windows DWM API의 일부입니다. 여기

내가 테스트 샘플 코드와 실제로 윈도우 8.1에서 빠른 사용자 전환과 협력 :

while (true) 
{ 
    HRESULT hr = DwmFlush(); 

    if (hr == S_OK) 
    { 
     std::cout << "TRUE" << std::endl; 
    } 
    else 
    { 
     std::cout << "FALSE" << std::endl; 
    } 

    Sleep(1000); 

}