[C#]防止進入螢幕保護程式

摘要:防止進入螢幕保護程式

最近為了轉檔,所以用遠端桌面在Server跑,不過因為偶爾要看一下狀態,所以當我切換到server時,都已經進入螢幕保護程式了,我必須要輸入密碼才能解除鎖定,真的很麻煩,所以開始找解決方案...
1.關閉螢幕保護程式
這個方法看起來很簡單,只需要把螢幕保護程式關閉就可以解決問題
2.通知系統目前程式畫面需要一直被顯示
這個做法和powerpoint或是一些影片程式的做法一樣,當我在播影片的時候當然不希望被螢幕保護程式干擾...不過這個經過測試好像沒效..

所以只好採取第一種方式...
記得在關閉螢幕保護程式前,先確定之前有沒有啟動,順便把狀態記下來,程式跑完的話還要記得復原,否則之後就沒有螢幕保護程式了!

程式碼: 
private enum SPI : uint 
{ 
SPI_GETSCREENSAVEACTIVE = 0x0010, 
SPI_SETSCREENSAVEACTIVE = 0x0011 
} 
private enum SPIF : uint 
{ 
None = 0x00, 
SPIF_UPDATEINIFILE = 0x01, 
SPIF_SENDCHANGE = 0x02, 
SPIF_SENDWININICHANGE = 0x02 
} 
[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, ref uint pvParam, SPIF fWinIni); 
[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, uint pvParam, SPIF fWinIni); 

/// <summary> 
/// 關閉螢幕保護程式 
/// </summary> 
public static void DisableScreensaver() 
{ 
SystemParametersInfo(SPI.SPI_SETSCREENSAVEACTIVE, 0, 0, SPIF.None); 
} 

/// <summary> 
/// 啟動螢幕保護程式 
/// </summary> 
public static void EnableScreensaver() 
{ 
SystemParametersInfo(SPI.SPI_SETSCREENSAVEACTIVE, 1, 0, SPIF.None); 
} 

/// <summary> 
/// 檢查是否有螢幕保護程式 
/// </summary> 
/// <returns>true:有,false:沒有</returns> 
public static bool CheckScreensaver() 
{ 
bool isActive = false; 
SystemParametersInfo(SPI.SPI_GETSCREENSAVEACTIVE, 0, ref isActive, SPIF.None); 
return isActive; 
} 

第二種方法或許也是有效,但是針對有螢幕保護可能就沒辦法...那個應該是要防止程式進入待命或休眠用的,有機會再試試看..一併附上程式碼與參考 
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern EXECUTION_STATE SetThreadExecutionState( 
EXECUTION_STATE flags); 

[Flags] 
private enum EXECUTION_STATE : uint 
{ 
ES_SYSTEM_REQUIRED = 0x00000001, 
ES_DISPLAY_REQUIRED = 0x00000002, 
// ES_USER_PRESENT = 0x00000004, 
ES_CONTINUOUS = 0x80000000 
} 

public static void PreventMonitorPowerdown() 
{ 
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED |EXECUTION_STATE.ES_CONTINUOUS); 
} 

public static void AllowMonitorPowerdown() 
{ 
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS); 
} 

參考連結:http://www.pinvoke.net/default.aspx/kernel32/setthreadexecutionstate.html