2015-12-21 12 views
13

Czy istnieje sposób sprawdzania okien, ile czasu pozostało do przejścia w tryb wstrzymania/uśpienia?Pozostały czas do zawieszenia systemu Windows

Używam vbscript i podejrzewam, że może istnieć odpowiedź WMI, ale każdy język, taki jak c/C++, * .NET, a nawet Java, jeśli to możliwe, może pasować do moich potrzeb.

EDIT

Chcę móc kwerendy systemu Windows ze sposobu, aby nie być powiadamiani o wydarzeniach, kiedy ma zamiar zawiesić.

+0

[? Co próbowałeś] (http://mattgemmell.com/what-have-you-tried/) – Drop

+4

Szukałem wszędzie punktu początkowego i nie mogłem znaleźć żadnego takiego pytania. Więc nie mam kodu. –

+0

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

Odpowiedz

7

Nie ma interfejsu API, aby wiedzieć, ile czasu pozostało, ponieważ system Windows spróbuje zakończyć wprowadzanie S3 (uśpienie) lub S4 (hibernacja) tak szybko, jak to możliwe.

System Windows wyśle ​​powiadomienie do wszystkich procesów dotyczących oczekującej zmiany stanu zasilania i zezwoli aplikacjom na przygotowanie się do tego zdarzenia.

Możesz znaleźć większość potrzebnych informacji: here.

Zasadniczo masz 20 sekund na przetworzenie pierwszej wiadomości. Twój proces może opóźnić odpowiadanie na wiadomość, dbając o wszystkie różne zadania związane z cyklem zasilania, np. zamykanie plików, zapisz stan itd

4

Możesz też zadzwonić CallNtPowerInformation funkcji API, które ma następujące params:

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

Z tej InformationLevel paramer Państwo przekazać wartość SystemPowerInformation enum że wypełnia lpOutputBuffer z SYSTEM_POWER_INFORMATION strukturę:

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

Następnie uzyskać TimeRemaining, co wyraża się w sekundach.

edytuj: przetestowany w VB.NET. edytuj: kod został dodany.

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 

Postać:

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

Istnieje błąd wspomniany w łączu z @HansPassant - * TimeRemaining jest faktycznie DŁUGIE , nie ULONG. (TimeRemaining idzie na liczby ujemne, gdy system ma się przespać, ale nie jest w stanie z jakiegokolwiek powodu.) * –

+0

czy mogę zobaczyć kod testowy VB.NET? –

+0

@ EduardoPoço Gotowe. – vulkanino

Powiązane problemy