2009-06-16 1 views

답변

13
class KeepDisplayOn 
{ 
public: 
    KeepDisplayOn() 
    { 
     mPrevExecState = ::SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_CONTINUOUS); 
     ::SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &mPrevScreenSaver, 0); 
     ::SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, FALSE, NULL, 0); 
    } 

    ~KeepDisplayOn() 
    { 
     ::SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, mPrevScreenSaver, NULL, 0); 
     ::SetThreadExecutionState(mPrevExecState); 
    } 

private: 
    UINT    mPrevScreenSaver; 
    EXECUTION_STATE  mPrevExecState; 
}; 
+2

멋진 사용 RAII –

+0

그러나 스레드 실행 상태를 ES_DISPLAY_REQUIRED로 설정하면 화면 보호기 시간 초과를 설정하지 않아도됩니다. 응용 프로그램이 실행되는 동안 사용자가 화면 보호기 설정을 변경하려면 어떻게해야합니까? – macbirdie

3

SetThreadExecutionState(ES_DISPLAY_REQUIRED|ES_CONTINUOUS);

+0

이것이 효과가 있습니까? –

+0

작동하지 않는 것과 반대? 그것이 MSDN에서 권장하는 것입니다. – MSN

5

첫 번째 응답하는 것처럼 글로벌 시스템 상태를 수정하지 않는 간단한 방법 : 당신의 윈도우 프로 시저에서

WM_SYSCOMMAND에 대한 처리기를 추가합니다. wParam이 SC_MONITORPOWER이면 DefWindowProc으로 연기하는 대신 0을 반환합니다. wParam이 다른 값인 경우 메시지를 처리하거나 DefWindowProc으로 전달하십시오. 그렇지 않으면 런타임에 윈도우를 조정하는 데 어려움을 겪습니다.

+0

이것은 전경 창에서만 작동합니다. – Anders

1

매분마다 마우스를 흔들어 씁니다.

mouse_event(MOUSEEVENTF_MOVE,1,0,0,0); 
mouse_event(MOUSEEVENTF_MOVE,-1,0,0,0); 
Sleep(60000); 
관련 문제