最近看了下電腦管家里面修復漏洞時阻止系統進入待機模式的實現,其實很簡單,哈哈。可以看一下這個MSDN上對這個API的說明:http://msdn.microsoft.com/en-us/library/aa373208(v=vs.85).aspx
以下是轉載
-----------------------------------------------------------------------------------------------
暴風影音在播放的時候會阻止屏幕保護程序的運行,並會防止系統關閉顯示器和進入待機狀態。以下就是用C#來實現這個功能。
1、阻止屏幕保護程序的運行
基本原理是播放時調用Windows API函數SystemParametersInfo()來關閉屏幕保護程序,播放結束后再重新打開。代碼如下:
- //定義API函數
- [DllImport("user32.dll")]
- static extern bool SystemParametersInfo(uint uiAction, bool uiParam, ref bool pvParam, uint fWinIni);
- const uint SPI_GETSCREENSAVEACTIVE = 0x0010;
- const uint SPI_SETSCREENSAVEACTIVE = 0x0011;
- const uint SPIF_SENDCHANGE = 0x0002;
- const uint SPIF_SENDWININICHANGE = SPIF_SENDCHANGE;
- //調用,其中函數內的false才是起作用的設置,active變量是在讀取設置的時候使用的,這里沒有實際意義。
- bool active = false;
- SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, false, ref active, SPIF_SENDWININICHANGE);
C#調用Windows API還是很方便的,只是數據類型轉換會比較麻煩,不過用得多了也就熟悉了。
另外有一種情況是原本屏幕保護程序並沒有打開。這可以通過SPI_GETSCREENSAVEACTIVE來獲取最初的配置,最后還原即可。
當然,要實現這個功能還有其他方法,比如窗體應用程序可以重寫Form.WndProc()方法來截獲系統消息SC_SCREENSAVE來終止屏保,或者用Windows Hook(鈎子)技術來截獲消息等。
2、防止系統關閉顯示器或進入待機狀態
同樣是調用Windows API函數,SetThreadExecutionState()。該函數可以重置系統的閑置時間(IdleTime),但是不能阻止屏保的運行。代碼如下:
- //定義API函數
- [DllImport("kernel32.dll")]
- static extern uint SetThreadExecutionState(uint esFlags);
- const uint ES_SYSTEM_REQUIRED = 0x00000001;
- const uint ES_DISPLAY_REQUIRED = 0x00000002;
- const uint ES_CONTINUOUS = 0x80000000;
- //播放時調用
- SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED);
- //播放結束后調用
- SetThreadExecutionState(ES_CONTINUOUS);
或者可以用一個System.Timers.Timer來定時調用SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED),看個人喜好吧。
以上函數的具體用法可以參考MSDN。WindowsAPI真的很神奇,值得日后好好研究。
http://blog.csdn.net/magictong/article/details/6560634