2009-06-16 22 views

Trả lời

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

sử dụng tốt đẹp của RAII –

+0

Nhưng việc đặt thời gian tiết kiệm màn hình không cần thiết khi bạn đặt trạng thái thực thi chuỗi thành ES_DISPLAY_REQUIRED. Điều gì sẽ xảy ra nếu người dùng muốn thay đổi cài đặt trình bảo vệ màn hình trong khi ứng dụng đang chạy? – macbirdie

3

SetThreadExecutionState(ES_DISPLAY_REQUIRED|ES_CONTINUOUS);

+0

Điều này có hiệu quả không? –

+0

Trái với việc không làm việc? Đó là những gì MSDN khuyến cáo. – MSN

5

Một cách đơn giản hơn mà không thay đổi trạng thái hệ thống toàn cầu như phản ứng đầu tiên thực hiện:

Trong thủ tục cửa sổ của bạn, thêm một handler cho WM_SYSCOMMAND. Khi wParam là SC_MONITORPOWER, trả lại 0 thay vì trì hoãn DefWindowProc. (Khi wParam là bất kỳ giá trị nào khác, hãy đảm bảo bạn xử lý tin nhắn hoặc chuyển nó đến DefWindowProc. Nếu không, người dùng sẽ gặp khó khăn trong việc điều chỉnh thời gian của bạn khi chạy.)

+0

Điều này chỉ hoạt động đối với cửa sổ nền trước – Anders

1

Lắc nhẹ chuột mỗi phút.

mouse_event(MOUSEEVENTF_MOVE,1,0,0,0); 
mouse_event(MOUSEEVENTF_MOVE,-1,0,0,0); 
Sleep(60000); 
Các vấn đề liên quan