阻止屏保運行、顯示器和系統待機(使用SystemParametersInfo和SetThreadExecutionState兩種辦法)


最近看了下電腦管家里面修復漏洞時阻止系統進入待機模式的實現,其實很簡單,哈哈。可以看一下這個MSDN上對這個API的說明:http://msdn.microsoft.com/en-us/library/aa373208(v=vs.85).aspx

 

 

    以下是轉載

-----------------------------------------------------------------------------------------------

     暴風影音在播放的時候會阻止屏幕保護程序的運行,並會防止系統關閉顯示器和進入待機狀態。以下就是用C#來實現這個功能。

1、阻止屏幕保護程序的運行

    基本原理是播放時調用Windows API函數SystemParametersInfo()來關閉屏幕保護程序,播放結束后再重新打開。代碼如下:

 

[c-sharp]  view plain  copy
 
  1. //定義API函數     
  2. [DllImport("user32.dll")]     
  3. static extern bool SystemParametersInfo(uint uiAction, bool uiParam, ref bool pvParam, uint fWinIni);     
  4. const uint SPI_GETSCREENSAVEACTIVE = 0x0010;     
  5. const uint SPI_SETSCREENSAVEACTIVE = 0x0011;     
  6. const uint SPIF_SENDCHANGE = 0x0002;     
  7. const uint SPIF_SENDWININICHANGE = SPIF_SENDCHANGE;     
  8. //調用,其中函數內的false才是起作用的設置,active變量是在讀取設置的時候使用的,這里沒有實際意義。     
  9. bool active = false;     
  10. SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, false, ref active, SPIF_SENDWININICHANGE);  

   

 

    C#調用Windows API還是很方便的,只是數據類型轉換會比較麻煩,不過用得多了也就熟悉了。
    另外有一種情況是原本屏幕保護程序並沒有打開。這可以通過SPI_GETSCREENSAVEACTIVE來獲取最初的配置,最后還原即可。
    當然,要實現這個功能還有其他方法,比如窗體應用程序可以重寫Form.WndProc()方法來截獲系統消息SC_SCREENSAVE來終止屏保,或者用Windows Hook(鈎子)技術來截獲消息等。

2、防止系統關閉顯示器或進入待機狀態

    同樣是調用Windows API函數,SetThreadExecutionState()。該函數可以重置系統的閑置時間(IdleTime),但是不能阻止屏保的運行。代碼如下:

  

[c-sharp]  view plain  copy
 
  1. //定義API函數     
  2. [DllImport("kernel32.dll")]     
  3. static extern uint SetThreadExecutionState(uint esFlags);     
  4. const uint ES_SYSTEM_REQUIRED = 0x00000001;     
  5. const uint ES_DISPLAY_REQUIRED = 0x00000002;     
  6. const uint ES_CONTINUOUS = 0x80000000;     
  7. //播放時調用     
  8. SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED);     
  9. //播放結束后調用     
  10. SetThreadExecutionState(ES_CONTINUOUS);  

 
    或者可以用一個System.Timers.Timer來定時調用SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED),看個人喜好吧。

 

    以上函數的具體用法可以參考MSDN。WindowsAPI真的很神奇,值得日后好好研究。

http://blog.csdn.net/magictong/article/details/6560634


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM