2015-12-21 11 views
13

Gibt es eine Möglichkeit, Fenster abzufragen, wie viel Zeit bis zum Suspend/Sleep-Modus bleibt?Zeit bis zum Suspendieren von Windows

Ich benutze VBScript und vermute, dass es eine WMI-Antwort geben könnte, aber jede Sprache wie C/C++, * .NET oder sogar Java, wenn möglich, kann meinen Bedürfnissen entsprechen.

EDIT

ich Windows mit einem Verfahren in der Lage sein wollen, abfragen, nicht durch Ereignisse benachrichtigt werden, wenn es um auszusetzen ist.

+0

[? Was Sie versucht haben] (http://mattgemmell.com/what-have-you-tried/) – Drop

+4

Ich habe überall nach einem Startpunkt gesucht und konnte nicht einmal eine Frage wie diese finden. Also, ich habe keinen Code. –

+0

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

Antwort

7

Es gibt keine API, um zu wissen, wie viel Zeit noch zur Verfügung steht, da Windows versuchen wird, die Eingabe von S3 (Ruhezustand) oder S4 (Ruhezustand) so schnell wie möglich abzuschließen.

Windows sendet eine Benachrichtigung an alle Prozesse über die ausstehende Änderung des Energiezustands und ermöglicht es Anwendungen, sich auf dieses Ereignis vorzubereiten.

Sie finden das meiste von dem, was Sie brauchen here.

Grundsätzlich haben Sie 20 Sekunden, um die erste Nachricht zu verarbeiten. Ihr Prozess kann die Antwort auf die Nachricht verzögern und sich um alle verschiedenen Energiezyklusaufgaben kümmern, z. Schließen von Dateien, speichern Sie Ihre Zustand usw.

4

Sie könnten CallNtPowerInformation API-Funktion, die die folgenden params nimmt anrufen möchten:

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

Im InformationLevel paramer Sie passieren den SystemPowerInformation ENUM-Wert, der die lpOutputBuffer mit einem füllt SYSTEM_POWER_INFORMATION Struktur:

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

erhalten dann die TimeRemaining, die in Sekunden ausgedrückt wird.

bearbeiten: in VB.NET getestet. bearbeiten: Code hinzugefügt.

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 

Form:

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

Es gibt einen Fehler im Link von @HansPassant - * TimeRemaining ist eigentlich LANG nicht ULONG. (TimeRemaining geht in negative Zahlen, wenn das System zu schlafen ist, aber aus irgendeinem Grund nicht in der Lage ist.) * –

+0

kann ich Ihren VB.NET-Testcode sehen? –

+0

@ EduardoPoço Fertig. – vulkanino

Verwandte Themen