サスペンド/スリープモードになるまでの時間をウィンドウに問い合わせる方法はありますか?Windowsがサスペンドするまでの時間は残ります
私はvbscriptを使用していますが、WMIの回答がある可能性がありますが、可能であればc/C++、* .NET、Javaなどの言語は私のニーズに合っている可能性があります。
EDIT
は、私は一時停止しようとしたときのイベントによって警告されるべきではなく、メソッドを使用してWindowsを照会できるようにしたいです。
サスペンド/スリープモードになるまでの時間をウィンドウに問い合わせる方法はありますか?Windowsがサスペンドするまでの時間は残ります
私はvbscriptを使用していますが、WMIの回答がある可能性がありますが、可能であればc/C++、* .NET、Javaなどの言語は私のニーズに合っている可能性があります。
EDIT
は、私は一時停止しようとしたときのイベントによって警告されるべきではなく、メソッドを使用してWindowsを照会できるようにしたいです。
WindowsはS3(スリープ)またはS4(休止状態)の入力をできるだけ早く完了しようとしてからどれくらいの時間が経過するかを知るAPIはありません。
Windowsは、保留中の電源状態の変更に関するすべてのプロセスに通知を送信し、アプリケーションがそのイベントを準備できるようにします。
hereのほとんどが必要です。
基本的に、最初のメッセージを処理するのに20秒間あります。プロセスは、メッセージへの返信を遅らせることができ、さまざまな電源サイクルタスクを処理することができます。近くのファイル、あなたは以下のparamsをとるCallNtPowerInformation
API関数を呼び出すしたい場合がありますなど、
をあなたの状態を保存する:あなたが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
@HansPassantからのリンクに記載されているバグがあります。* TimeRemainingは実際にはLONGですULONGではなく、 (TimeRemainingは、システムがスリープ状態になると負の数になりますが、何らかの理由で応答できません)* –
VB.NETのテストコードが表示されることがありますか? –
@EduardoPoçoDone。 – vulkanino
[?あなたは何を試してみました](http://mattgemmell.com/what-have-you-tried/ ) – Drop
私はどこから出発点を探していますし、このような質問も見つけられませんでした。だから、コードはありません。 –
https://msdn.microsoft.com/en-us/library/windows/desktop/aa373217%28v=vs.85%29.aspx –