2009-06-16 13 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 – 2009-06-16 19:20:47

+0

但設置屏幕保護程序的超時時間是沒有必要的。如果用戶想在應用程序運行時更改屏幕保護程序設置,該怎麼辦? – macbirdie 2009-06-17 13:32:19

3

SetThreadExecutionState(ES_DISPLAY_REQUIRED|ES_CONTINUOUS);

+0

這項工作? – 2009-11-28 01:11:54

5

像第一反應確實不修改全局系統狀態更簡單的方法:

在你的窗口過程中,添加一個處理WM_SYSCOMMAND。當wParam爲SC_MONITORPOWER時,返回0而不是推遲到DefWindowProc。 (當wParam是任何其他值時,請確保您處理該消息或將其傳遞到DefWindowProc,否則用戶將無法在運行時調整窗口。)

1

每分鐘左右擺動鼠標。一旦你設置線程執行狀態ES_DISPLAY_REQUIRED

mouse_event(MOUSEEVENTF_MOVE,1,0,0,0); 
mouse_event(MOUSEEVENTF_MOVE,-1,0,0,0); 
Sleep(60000); 
相關問題