2017-03-13 9 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で呼び出されず、戻り値も意味がありません。 ただし、スリープモードは、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); 
    } 
関連する問題