如何防止Windows进入闲置状态?
我正在处理一个C#应用程序,在后台运行没有任何Windows控制。
我想通知Windows我的应用程序仍然活着,以防止Windows进入空闲状态。
有没有任何API可以从我的应用程序调用,通知Windows操作系统,我的应用程序还活着?
提前致谢。
你必须使用SetThreadExecutionState函数。 像这样的东西:
public partial class MyWinForm: Window { private uint fPreviousExecutionState; public Window1() { InitializeComponent(); // Set new state to prevent system sleep fPreviousExecutionState = NativeMethods.SetThreadExecutionState( NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); if (fPreviousExecutionState == 0) { Console.WriteLine("SetThreadExecutionState failed. Do something here..."); Close(); } } protected override void OnClosed(System.EventArgs e) { base.OnClosed(e); // Restore previous state if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0) { // No way to recover; already exiting } } } internal static class NativeMethods { // Import SetThreadExecutionState Win32 API and necessary flags [DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags); public const uint ES_CONTINUOUS = 0x80000000; public const uint ES_SYSTEM_REQUIRED = 0x00000001; }
你有几个select:
-
使用SetThreadExecutionState ,其中:
使应用程序能够通知系统正在使用,从而防止系统在应用程序运行时进入睡眠状态或closures显示器。
您可以在哪里使用
ES_SYSTEM_REQUIRED
标志通过重置系统空闲计时器强制系统处于工作状态。
-
使用SendInput来伪造按键,鼠标移动/点击
- 另一种select是将您的应用程序更改为Windows服务。
SetThreadExecutionState示例
// Television recording is beginning. Enable away mode and prevent // the sleep idle time-out. SetThreadExecutionState( ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED); // Wait until recording is complete... // Clear EXECUTION_STATE flags to disable away mode and allow the system // to idle to sleep normally. SetThreadExecutionState(ES_CONTINUOUS);
你可以使用SetThreadExecutionState
描述的SetThreadExecutionState
:
- SetThreadExecutionState函数
由于它是一个Win32 API函数,所以要从C#使用它,你需要PInvoke它。 这里描述的步骤包括一个示例方法PreventSleep
临时禁用睡眠模式:
- PInvoke.net:setthreadexecutionstate(kernel32)
我不认为有任何方法直接在托pipe代码中执行此操作。
快速search显示这个职位从2年前。 基本上你需要做一些互操作来调用一个原始的Windows API。
这里是SetThreadExecutionState
C#实现