WaitForSingleObject立即发出信号

时间:2016-03-24 16:32:46

标签: c# winforms wakeup sleep-mode

我正在尝试让我的电脑醒来以防它进入睡眠模式。我在某个网站上找到了这段代码片段,但最后添加的Messagebox总是立即返回。

我还启用了系统,以便在电源选项中使用唤醒定时器。

[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分钟后发出信号,对吧? 为什么立即发出信号,我该如何纠正?

1 个答案:

答案 0 :(得分:2)

SetWaitableTimer()可以在绝对时间和增量时间触发。来自MSDN文章:

  

pDueTime [in]
  定时器状态设置为发信号的时间,以100纳秒为间隔。使用FILETIME结构描述的格式。 值表示绝对时间。请务必使用基于UTC的绝对时间,因为系统在内部使用基于UTC的时间。负值表示相对时间。实际的计时器精度取决于硬件的功能。有关基于UTC的时间的更多信息,请参阅系统时间。

现在你使用了一个正值,所以你在1600年指定了一个日期,它总是立即完成。看起来您的实际意图是使用2分钟间隔,因此您必须使用负值-1200000000。

可能的真实意图是让它在时钟的特定时间唤醒,给定使用场景,使用DateTime.ToUniversalTime()。ToFileTime()