我试图使我的电脑唤醒,以防它进入睡眠模式。我在某些网站上找到了此代码段,但最后添加的消息框始终会立即返回。
我还启用了电源选项中唤醒定时器的系统。
[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分钟后发出信号,对吧?
为什么立即发出信号,我该如何纠正?
最佳答案
SetWaitableTimer()可以同时触发绝对时间和增量时间。从MSDN文章:
pDueTime [输入]
以100纳秒的间隔将计时器的状态设置为发出信号的时间。使用FILETIME结构描述的格式。正值表示绝对时间。请确保使用基于UTC的绝对时间,因为系统在内部使用基于UTC的时间。负值表示相对时间。计时器的实际精度取决于硬件的能力。有关基于UTC的时间的更多信息,请参见系统时间。
现在您使用了一个正值,因此您指定了一个1600年的日期,它总是立即完成。看起来您的实际意图是使用2分钟间隔,因此您必须使用负值-1200000000。
可能的真实意图是在给定使用方案的情况下,使其在时钟的特定时间唤醒,请使用DateTime.ToUniversalTime()。ToFileTime()