从Windows服务调用时,SetThreadExecutionState不起作用

我想阻止系统从Windows服务hibernate/hibernate。 我正在调用SetThreadExecutionState函数来做到这一点。 但似乎没有效果。 我只想知道SetThreadExecutionState函数是否适用于windows服务。 如果不是什么将是替代方法。

以下是我正在使用的C#代码。 我打电话给Onstart服务的方法。

 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern uint SetThreadExecutionState(EXECUTION_STATE esFlags); private void KeepAlive() { SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS) } 

Solutions Collecting From Web of "从Windows服务调用时,SetThreadExecutionState不起作用"

在没有ES_CONTINUOUS的情况下调用SetThreadExecutionState只需重置空闲计时器; 为了保持显示或系统处于工作状态,线程必须定期调用SetThreadExecutionState。

( 来源 )

你需要不时地调用这个函数。 这不是一场“火灾与遗忘”。

SetThreadExecutionState只对调用它的线程有效。 如果在工作线程中调用它,即使使用ES_CONTINUOUS,一旦工作线程死亡,设置不再有效,然后屏幕保护程序将再次打开。

从一个Timer中调用这个API将在前一个线程死亡之前唤醒一个工作线程,并使之工作。

因此,如果您在主线程中调用SetThreadExecutionState,如客户端应用程序中的UI线程,则不需要计时器。