加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Windows操作系统能够在多长时间内从唤醒定时器唤醒?

发布时间:2020-12-16 07:01:10 所属栏目:百科 来源:网络整理
导读:我正在使用C和Win API编写程序.我使用 SetSuspendState()API将系统发送到睡眠模式(有可能在唤醒定时器上唤醒,’DisableWakeEvent’设置为FALSE.)然后我使用CreateWaitableTimer和SetWaitableTimer API来设置实际的定时器.问题是,如果在系统进入睡眠模式后过
我正在使用C和Win API编写程序.我使用 SetSuspendState()API将系统发送到睡眠模式(有可能在唤醒定时器上唤醒,’DisableWakeEvent’设置为FALSE.)然后我使用CreateWaitableTimer和SetWaitableTimer API来设置实际的定时器.问题是,如果在系统进入睡眠模式后过早设置唤醒定时器,系统有时不会唤醒.

所以我很好奇是否有一个最小的时间必须通过,因为系统被发送到睡眠模式,然后才能以编程方式唤醒唤醒定时器?

解决方法

马上.您的PC可以使用计时器唤醒:

Schedule machine to wake up

C#文章如果你不介意:http://www.codeproject.com/Articles/49798/Wake-the-PC-from-standby-or-hibernation

using System;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System.ComponentModel;
using System.Threading;

namespace WakeUPTimer
{
    class WakeUP
    {
        [DllImport("kernel32.dll")]
        public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes,bool bManualReset,string lpTimerName);

        [DllImport("kernel32.dll",SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWaitableTimer(SafeWaitHandle hTimer,[In] ref long pDueTime,int lPeriod,IntPtr pfnCompletionRoutine,IntPtr lpArgToCompletionRoutine,bool fResume);

        public event EventHandler Woken;

        private BackgroundWorker bgWorker = new BackgroundWorker();

        public WakeUP()
        {
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += 
              new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        }

        public void SetWakeUpTime(DateTime time)
        {
            bgWorker.RunWorkerAsync(time.ToFileTime());
        }

        void bgWorker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
        {
            if (Woken != null)
            {
                Woken(this,new EventArgs());
            }
        }

        private void bgWorker_DoWork(object sender,DoWorkEventArgs e) 
        {
            long waketime = (long)e.Argument;

            using (SafeWaitHandle handle = 
                      CreateWaitableTimer(IntPtr.Zero,true,this.GetType().Assembly.GetName().Name.ToString() + "Timer"))
            {
                if (SetWaitableTimer(handle,ref waketime,IntPtr.Zero,true))
                {
                    using (EventWaitHandle wh = new EventWaitHandle(false,EventResetMode.AutoReset))
                    {
                        wh.SafeWaitHandle = handle;
                        wh.WaitOne();
                    }
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
        }

    }
}

或者从控制面板:http://www.anuko.com/content/world_clock/faq/enable_wake_timers.htm

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读