2015-12-21 18 views
13

サスペンド/スリープモードになるまでの時間をウィンドウに問い合わせる方法はありますか?Windowsがサスペンドするまでの時間は残ります

私はvbscriptを使用していますが、WMIの回答がある可能性がありますが、可能であればc/C++、* .NET、Javaなどの言語は私のニーズに合っている可能性があります。

EDIT

は、私は一時停止しようとしたときのイベントによって警告されるべきではなく、メソッドを使用してWindowsを照会できるようにしたいです。

+0

[?あなたは何を試してみました](http://mattgemmell.com/what-have-you-tried/ ) – Drop

+4

私はどこから出発点を探していますし、このような質問も見つけられませんでした。だから、コードはありません。 –

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/aa373217%28v=vs.85%29.aspx –

答えて

7

WindowsはS3(スリープ)またはS4(休止状態)の入力をできるだけ早く完了しようとしてからどれくらいの時間が経過するかを知るAPIはありません。

Windowsは、保留中の電源状態の変更に関するすべてのプロセスに通知を送信し、アプリケーションがそのイベントを準備できるようにします。

hereのほとんどが必要です。

基本的に、最初のメッセージを処理するのに20秒間あります。プロセスは、メッセージへの返信を遅らせることができ、さまざまな電源サイクルタスクを処理することができます。近くのファイル、あなたは以下のparamsをとるCallNtPowerInformation API関数を呼び出すしたい場合がありますなど、

4

をあなたの状態を保存する:あなたがlpOutputBufferを満たすSystemPowerInformation列挙型の値を渡すInformationLevel paramerで

NTSTATUS WINAPI CallNtPowerInformation(
    _In_ POWER_INFORMATION_LEVEL InformationLevel, 
    _In_ PVOID     lpInputBuffer, 
    _In_ ULONG     nInputBufferSize, 
    _Out_ PVOID     lpOutputBuffer, 
    _In_ ULONG     nOutputBufferSize 
); 

SYSTEM_POWER_INFORMATION構造:次に

typedef struct _SYSTEM_POWER_INFORMATION { 
    ULONG MaxIdlenessAllowed; 
    ULONG Idleness; 
    ULONG TimeRemaining; 
    UCHAR CoolingMode; 
} SYSTEM_POWER_INFORMATION, *PSYSTEM_POWER_INFORMATION; 

秒単位で表されTimeRemainingを取得。

編集:VB.NETでテストされています。 編集:コードが追加されました。

Queryer.vb

Imports System.Runtime.InteropServices 

Public Class Queryer 

    Const SystemPowerInformation As Integer = 12 
    Const STATUS_SUCCESS As Integer = 0 

    Private Structure SYSTEM_POWER_INFORMATION 
     Public MaxIdlenessAllowed As UInteger 
     Public Idleness As UInteger 
     Public TimeRemaining As Integer 
     Public CoolingMode As Byte 
    End Structure 

    <DllImport("PowrProf.dll", SetLastError:=True, CharSet:=CharSet.Auto)> 
    Public Shared Function CallNtPowerInformation(
      ByVal InformationLevel As Int32, 
      ByVal lpInputBuffer As IntPtr, 
      ByVal nInputBufferSize As UInt32, 
      ByVal lpOutputBuffer As IntPtr, 
      ByRef nOutputBufferSize As UInt32) As UInt32 
    End Function 

    Public Function Query() As Integer 

     Dim PowerInformation As SYSTEM_POWER_INFORMATION 
     Dim Status As IntPtr = IntPtr.Zero 
     Dim ReturnValue As UInteger 
     Try 
      Status = Marshal.AllocCoTaskMem(Marshal.SizeOf(GetType(SYSTEM_POWER_INFORMATION))) 
      ReturnValue = CallNtPowerInformation(SystemPowerInformation, Nothing, 0, Status, Marshal.SizeOf(GetType(SYSTEM_POWER_INFORMATION))) 

      PowerInformation = Marshal.PtrToStructure(Status, GetType(SYSTEM_POWER_INFORMATION)) 
     Catch ex As Exception 
      Return 0 
     Finally 
      Marshal.FreeCoTaskMem(Status) 

     End Try 
     Return PowerInformation.TimeRemaining 

    End Function 

End Class 

フォーム:

Public Class Form1 


    Public Sub Loader() Handles Me.Load 

     Dim rolex As New Timer() 
     rolex.Interval = 500 
     AddHandler rolex.Tick, AddressOf TimerScattato 

     rolex.Start() 

    End Sub 

    Private Sub TimerScattato() 
     Dim secondi As Integer = q.Query() 
     Dim iSpan As TimeSpan = TimeSpan.FromSeconds(secondi) 

     lblTimeLeft.Text = String.Format("{0,2}:{1,2}:{2,2}", iSpan.Hours, iSpan.Minutes, iSpan.Seconds) 


    End Sub 

    Private q As New Queryer 
End Class 
+1

@HansPassantからのリンクに記載されているバグがあります。* TimeRemainingは実際にはLONG​​ですULONGではなく、 (TimeRemainingは、システムがスリープ状態になると負の数になりますが、何らかの理由で応答できません)* –

+0

VB.NETのテストコードが表示されることがありますか? –

+0

@EduardoPoçoDone。 – vulkanino

関連する問題