2017-03-13 3 views
0

Ich schreibe Windows-Dienst, die regelmäßig einige Arbeit im Hintergrund-Modus. Und wenn er diese Arbeit macht, sollte ich Computer nicht automatisch in den Schlafmodus wechseln lassen. Ich setze CanHandlePowerEvent auf True und Override OnPowerEvent-Methode. Ich bekomme einige PowerBroadcastStatus, aber QuerySuspend niemals. Also, wenn der Computer im Leerlauf ist, dann bekomme ich nach einiger Zeit PowerBroadcastStatus.Suspend, aber ich erwarte, dass ich PowerBroadcastStatus.QuerySuspend bekommen sollte und für den Fall, dass mein Dienst mit seiner Arbeit beschäftigt ist, sollte ich false zurückgeben und den Computer nicht schlafen gehen lassen Modus. Warum QuerySuspend nie kommt?Windows-Dienst QuerySuspend kommt nie

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; 
    } 

Antwort

0

Scheint, dass dieses Szenario überhaupt nicht funktioniert. OnPowerEvent nie mit QuerySuspend aufgerufen, und Rückgabewert haben keine Sens. Der Schlafmodus kann jedoch über 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); 
    } 
gesteuert werden