2017-03-13 2 views
0

J'écris le service de Windows qui effectue périodiquement un travail en arrière-plan. Et quand il fait ce travail, je devrais interdire l'ordinateur de passer en mode veille automatiquement. J'ai défini CanHandlePowerEvent sur true et remplacé la méthode OnPowerEvent. Je reçois des PowerBroadcastStatus, mais QuerySuspend jamais. Donc, quand l'ordinateur est inactif puis après un certain temps je reçois PowerBroadcastStatus.Suspend, mais je suppose, que je devrais obtenir PowerBroadcastStatus.QuerySuspend et au cas où mon service est occupé avec son travail, je devrais retourner false et c'est interdit d'ordinateur pour aller dormir mode. Pourquoi QuerySuspend ne vient jamais?Windows service QuerySuspend ne vient jamais

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

Répondre

0

Ce scénario ne fonctionne pas du tout. OnPowerEvent n'a jamais été appelé avec QuerySuspend et la valeur de retour n'a pas de sens. Cependant, le mode veille peut être contrôlé via 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); 
    }