Подтвердить что ты не робот

Осталось времени до приостановления Windows

Есть ли способ запросить окна, сколько времени осталось до перехода в режим ожидания/спячки?

Я использую vbscript и подозреваю, что может быть ответ WMI, но любой язык, такой как c/С++, *.NET или даже java, по возможности, может соответствовать моим потребностям.

ИЗМЕНИТЬ

Я хочу иметь возможность запрашивать Windows с помощью метода, чтобы не быть предупрежденным о событиях, когда он собирается приостановить.

4b9b3361

Ответ 1

Нет никакого API, чтобы узнать, сколько времени осталось, так как Windows попытается как можно быстрее завершить ввод S3 (Sleep) или S4 (Hibernate).

Windows отправит уведомление обо всех процессах об изменении состояния ожидающего изменения мощности и разрешит приложениям готовиться к этому событию.

Вы можете найти большую часть того, что вам нужно здесь.

В основном у вас есть 20 секунд для обработки первого сообщения. Ваш процесс может задерживать ответ на сообщение, выполняя все различные задачи цикла питания, например. закрыть файлы, сохранить ваше состояние и т.д.

Ответ 2

Вы можете вызвать функцию API CallNtPowerInformation, которая принимает следующие параметры:

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

В параметре InformationLevel вы передаете значение перечисления SystemPowerInformation, которое заполняет lpOutputBuffer структурой SYSTEM_POWER_INFORMATION:

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

Затем получите TimeRemaining, который выражается в секундах.

edit: проверено в VB.NET. edit: добавлен код.

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