2017-03-13 106 views
0

我寫了windows服務,它定期在後臺模式下做一些工作。 當他做這項工作時,我應該禁止電腦自動進入睡眠模式。 我將CanHandlePowerEvent設置爲true,並重寫OnPowerEvent方法。我得到了一些PowerBroadcastStatuses,但是QuerySuspend從來沒有。 因此,當計算機空閒,然後一段時間後,我得到PowerBroadcastStatus.Suspend,但我期望,我應該得到PowerBroadcastStatus.QuerySuspend,如果我的服務忙於他的工作,我應該返回false,並且它禁止計算機進入睡眠模式。 爲什麼QuerySuspend永遠不會來?Windows服務QuerySuspend永遠不會出現

protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus) 
    { 
     switch (powerStatus) { 
      case PowerBroadcastStatus.BatteryLow: 
      case PowerBroadcastStatus.OemEvent: 
      case PowerBroadcastStatus.PowerStatusChange: 
      case PowerBroadcastStatus.QuerySuspendFailed: 
       break; 
      case PowerBroadcastStatus.QuerySuspend: { 
       return MyProc.IsIdle; 
       break; 
      } 
      case PowerBroadcastStatus.ResumeAutomatic: 
      case PowerBroadcastStatus.ResumeCritical: 
      case PowerBroadcastStatus.ResumeSuspend: 
       Play(); 
       break; 
      case PowerBroadcastStatus.Suspend: 
       Pause(); 
       break; 
     } 
     return true; 
    } 

回答

0

似乎這種情況根本不起作用。 OnPowerEvent從未使用QuerySuspend調用,並且返回值沒有sens。 但是,睡眠模式可以通過控制SetThreadExecutionState

[FlagsAttribute] 
    public enum ExecutionState : uint 
    { 
     AwaymodeRequired = 0x00000040, 
     Continuous = 0x80000000, 
     DisplayRequired = 0x00000002, 
     SystemRequired = 0x00000001 
    } 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern ExecutionState SetThreadExecutionState(ExecutionState esFlags); 


    var prevState = SetThreadExecutionState(ExecutionState.Continuous | ExecutionState.SystemRequired); 
    try { 
     //some code 
    } 
    finally { 
     SetThreadExecutionState(prevState); 
    }