2

スリープモードになった場合に備えて、PCをウェイクアップさせようとしています。いくつかの Web サイトでこのコード スニペットを見つけましたが、最後に追加したメッセージ ボックスは常にすぐに返されます。

また、システムの電源オプションでウェイク タイマーを使用できるようにしました。

[DllImport("kernel32.dll")]
    public static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes,
    bool bManualReset, string lpTimerName);

    [DllImport("kernel32.dll")]
    public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long
    pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr
    lpArgToCompletionRoutine, bool fResume);

    [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
    public static extern Int32 WaitForSingleObject(IntPtr handle, uint
    milliseconds);

    static IntPtr handle;

    private void SetWaitForWakeUpTime()
    {
        long duetime = 1200000000;
        handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer");
        SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true);
        uint INFINITE = 0xFFFFFFFF;
        int ret = WaitForSingleObject(handle, INFINITE);
        MessageBox.Show("wake up !");
    }

そして、私はそれを次のように呼んでいます:

private void buttonTest_Click(object sender, EventArgs e)
    {
        SetWaitForWakeUpTime();
    }

理論的には、これは 2 分後にしか通知されないはずですよね? すぐに通知されるのはなぜですか?どうすれば修正できますか?

4

1 に答える 1

2

SetWaitableTimer() は、絶対時間と増分時間の両方でトリガーできます。MSDN の記事から:

pDueTime [入力]
タイマーの状態がシグナル状態に設定されるまでの時間 (100 ナノ秒間隔)。FILETIME 構造体で記述された形式を使用します。の値は絶対時間を示します。システムは内部的に UTC ベースの時刻を使用するため、必ず UTC ベースの絶対時刻を使用してください。負の値は相対時間を示します。実際のタイマーの精度は、ハードウェアの機能によって異なります。UTC ベースの時刻の詳細については、「システム時刻」を参照してください。

現在、正の値を使用しているため、1600 年の日付を指定すると、常に即座に完了します。あなたの実際の意図は 2 分の間隔を使用することだったように見えるので、負の値 -1200000000 を使用する必要があります。

おそらく本当の意図は、使用シナリオを考えると、時計の特定の時間にウェイクアップさせることです。DateTime.ToUniversalTime().ToFileTime() を使用します。

于 2016-03-24T17:31:07.507 に答える