2009-06-16 10 views

risposta

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

piacevole uso di RAII –

+0

Ma impostazione dello screen saver time out non è necessario una volta impostato lo stato di esecuzione thread per ES_DISPLAY_REQUIRED. Cosa succede se l'utente desidera modificare le impostazioni dello screen saver mentre l'applicazione è in esecuzione? – macbirdie

3

SetThreadExecutionState(ES_DISPLAY_REQUIRED|ES_CONTINUOUS);

+0

Questo lavoro dovrebbe funzionare? –

+0

Al contrario di non lavorare? Questo è ciò che MSDN consiglia. – MSN

5

Un modo più semplice che non modifica lo stato del sistema globale come la prima risposta fa:

Nella vostra window procedure, aggiungere un gestore per WM_SYSCOMMAND. Quando wParam è SC_MONITORPOWER, restituire 0 invece di posticipare a DefWindowProc. (Quando wParam è qualsiasi altro valore, assicurati di gestire il messaggio o di passarlo a DefWindowProc. Altrimenti l'utente avrà difficoltà a regolare la finestra in fase di esecuzione.)

+0

Questo funziona solo per la finestra in primo piano – Anders

1

Wiggle the mouse ogni minuto circa.

mouse_event(MOUSEEVENTF_MOVE,1,0,0,0); 
mouse_event(MOUSEEVENTF_MOVE,-1,0,0,0); 
Sleep(60000); 
Problemi correlati