我正在尝试让我的电脑醒来以防它进入睡眠模式。我在某个网站上找到了这段代码片段,但最后添加的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分钟后发出信号,对吧? 为什么立即发出信号,我该如何纠正?
答案 0 :(得分:2)
SetWaitableTimer()可以在绝对时间和增量时间触发。来自MSDN文章:
pDueTime [in]
定时器状态设置为发信号的时间,以100纳秒为间隔。使用FILETIME结构描述的格式。 正值表示绝对时间。请务必使用基于UTC的绝对时间,因为系统在内部使用基于UTC的时间。负值表示相对时间。实际的计时器精度取决于硬件的功能。有关基于UTC的时间的更多信息,请参阅系统时间。
现在你使用了一个正值,所以你在1600年指定了一个日期,它总是立即完成。看起来您的实际意图是使用2分钟间隔,因此您必须使用负值-1200000000。
可能的真实意图是让它在时钟的特定时间唤醒,给定使用场景,使用DateTime.ToUniversalTime()。ToFileTime()