Temps restant jusqu’à la suspension de Windows

Existe-t-il un moyen d’interroger Windows combien de temps rest-t-il jusqu’à ce qu’il passe en mode suspension / veille?

J’utilise vbscript et je pense qu’il pourrait y avoir une réponse WMI, mais n’importe quel langage comme c / c ++, * .NET ou même Java, si possible, peut répondre à mes besoins.

MODIFIER

Je veux pouvoir interroger Windows avec une méthode, pour ne pas être alerté par des événements sur le sharepoint le suspendre.

Il n’y a pas d’API pour savoir combien de temps il rest depuis que Windows essaiera de terminer la saisie de S3 (Sleep) ou S4 (Hibernate) aussi rapidement que possible.

Windows enverra une notification à tous les processus concernant le changement d’état de l’alimentation en attente et autorisera les applications à se préparer à cet événement.

Vous pouvez trouver la plupart de ce dont vous avez besoin ici .

En gros, vous avez 20 secondes pour traiter le premier message. Votre processus peut retarder la réponse au message en prenant en charge toutes les différentes tâches du cycle d’alimentation, par exemple en fermant des fichiers, en sauvegardant votre état, etc.

Vous souhaiterez peut-être appeler la fonction API CallNtPowerInformation qui prend les parameters suivants:

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

Dans le paramètre InformationLevel vous passez la valeur enum SystemPowerInformation qui remplit le lpOutputBuffer avec une structure SYSTEM_POWER_INFORMATION :

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

Ensuite, obtenez le TimeRemaining , qui est exprimé en secondes.

edit: testé dans VB.NET. edit: code ajouté.

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

Forme:

 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 = Ssortingng.Format("{0,2}:{1,2}:{2,2}", iSpan.Hours, iSpan.Minutes, iSpan.Seconds) End Sub Private q As New Queryer End Class