范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C控制电脑睡眠,休眠,关机以及唤醒

  最近碰到一个关于芯片测试过程中的问题,这颗芯片是用在笔记本端口上,笔记本客户那边会有一个压力测试,就是频繁的电脑电源状态切换,S0(正常使用的开机状态),S3(睡眠模式),S4(休眠模式)以及S5(关机模式)。
  当然,主要是客户在压力测试过程中,发现了芯片会不正常的死锁,客户那边将机台寄回来,那么该如何复现呢?客户那边会有自己的一套压力测试系统,不过会测试很多东西,不太方便给我们,而且每一次循环耗时比较久。那么,能不能自己搭建一套控制电脑睡眠,休眠,关机以及唤醒的程序呢?
  上面讲的是一个应用背景,告诉大家这其实也是有需求的,只是平时不太用而已,将其记录下来:
  首先,从电脑开机状态S0切换到S3,S4甚至是S5,都是比较容易实现的,见下面代码:Application.SetSuspendState(PowerState.Suspend, false, false);//从S0进入S3 Application.SetSuspendState(PowerState.Hibernate,false,false);//从S0进入S4  Process.Start("shutdown","/s /t 0");    // 参数 /s 的意思是要关闭计算机                                         // 参数 /t 0 的意思是告诉计算机 0 秒之后执行命令 Process.Start("shutdown", "/r /t 0"); // 参数 /r 的意思是要重新启动计算机
  只要调用上述语句即可实现从S0到其他的电源状态,那么反过来唤醒呢?
  唤醒的难点在于:当处于S3,S4以及S5的状态下,我的上位机程序是不会运行的,因此,在上位机软件的定时唤醒也是没法工作的。那么笔记本客户那边是怎么操作的呢?他们会通过底层的EC控制来显示上述的功能,可是,我们是不知道底层EC的接口,而且,我们需要一个通用的程式,那要怎么实现呢?
  在笔记本的设计中,在S3,S4,S5通常不是所有的东西都会关掉,通常会有一个硬件定时器还在开着,如果我们能操作这个定时器,那是不是就可以实现我们想要的功能呢?
  可以调用下面的两个函数,即CreateWaitableTimer以及SetWaitableTimer,这两个函数就可以控制电脑里面开的硬件定时器,当然这个硬件定时器是CPU里面的还是EC里面的,我也不太清楚,没研究过,如果有大神研究过,可以留言,我也学习学习。[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);
  另外,需要说明的一点是,使用这个定时器也是有条件的,你需要先设置笔记本," Control Panel > Power Options > Change Plan Settings > Change Advanced Power Settings > Sleep > Allow Wake Timers ", 使能定时器唤醒,还有就是," Control Panel > Power Options > Change Plan Settings > Change Advanced Power Settings > Brad / Additional Settings > Require a password on wakeup ",关闭唤醒需要密码。
  完成上面的设置,其实已经可以实现电脑从S3,S4,S5唤醒了,但在我使用的过程中,其实还碰到了一个问题,就是唤醒之后,屏幕不亮,你就会误认为没有唤醒,因此我增加了控制鼠标移动的命令,这样,唤醒之后,屏幕就会亮起。[DllImport("user32.dll")] public static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo);  mouse_event(0x0001,0,1,0,UIntPtr.Zero); mouse_event(0x0001, 0, -1, 0, UIntPtr.Zero);
  另外还有一点需要注意,就是笔记本从S0->S3/S4/S5->S0这个循环里面,S0,S3/S4/S5这几个状态的停留时间一定要足够,因为,每个笔记本的完全进入各个状态的时间会不一样,比如,我用我自己的笔记本,这几个状态的停留时间要至少20s,否则,笔记本还没有完全进入就要退出,就会导致,电脑把WaitableTimer关掉,而笔记本还没有唤醒,导致程式死锁。而新的刚买的笔记本,只需要设置10s即可完全进入。
  废话不多说,直接上代码:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices;  namespace AutoSwitchGUI {     public partial class AutoSwitchGUI : Form     {         [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);          [DllImport("kernel32.dll")]         public static extern uint SetThreadExecutionState(uint esFlags);          [DllImport("user32.dll")]         public static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo);          //public event EventHandler Woken;         private BackgroundWorker bgWorker = new BackgroundWorker();          public struct auto_switch_gui_status_t         {             public bool test_status;             public UInt64 test_times_cnt;             public UInt64 test_times;             public byte cur_state;              public int s0_duration;             public int s3_duration;         }         public auto_switch_gui_status_t auto_switch_status;         public AutoSwitchGUI()         {             InitializeComponent();             bgWorker.DoWork += new DoWorkEventHandler(bgWorker_Dowork);             bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);         }          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, 0, IntPtr.Zero, IntPtr.Zero, true))                 {                     using (EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset))                     {                         wh.SafeWaitHandle = handle;                         wh.WaitOne();                     }                 }                 else                 {                     throw new Win32Exception(Marshal.GetLastWin32Error());                 }             }         }          private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)         {             mouse_event(0x0001,0,1,0,UIntPtr.Zero);             mouse_event(0x0001, 0, -1, 0, UIntPtr.Zero);             auto_switch_status.test_times_cnt++;             TestTimes.Text = auto_switch_status.test_times_cnt.ToString();             SystemTimer.Interval = auto_switch_status.s0_duration * 1000;             SystemTimer.Start();         }          public void SetWakeUpTime(UInt64 time)         {             bgWorker.RunWorkerAsync(System.DateTime.Now.AddSeconds(time).ToFileTime());         }          private void StartButton_Click(object sender, EventArgs e)         {             try             {                 auto_switch_status.test_times = UInt64.Parse(SetTestTimes.Text);                 auto_switch_status.s0_duration = int.Parse(S0Duration.Text);                 auto_switch_status.s3_duration = int.Parse(S3Duration.Text);                 if (auto_switch_status.test_times > 0)                 {                     //SetThreadExecutionState(0x00000001 | 0x00000002 | 0x80000000 | 0x00000040);                     TestStatus.BackColor = Color.Green;                     auto_switch_status.test_status = true;                     TestTimes.Text = "0";                     auto_switch_status.test_times_cnt = 0;                     SystemTimer.Interval = auto_switch_status.s0_duration*1000;                     auto_switch_status.cur_state = 0;                     SystemTimer.Start();                     return;                 }             }             catch             {              }             MessageBox.Show("Configuration Failed!");         }          private void StopButton_Click(object sender, EventArgs e)         {             SystemTimer.Stop();             auto_switch_status.test_status = true;             TestStatus.BackColor = Color.Red;         }          private void SystemTimer_Tick(object sender, EventArgs e)         {             if (auto_switch_status.cur_state == 0)             {                 auto_switch_status.cur_state = 0;                 SystemTimer.Stop();                 if (auto_switch_status.test_times_cnt >= auto_switch_status.test_times)                 {                 }                 else                 {                     SetWakeUpTime((UInt64)auto_switch_status.s3_duration);                     Application.SetSuspendState(PowerState.Suspend, false, false);                     //Application.SetSuspendState(PowerState.Hibernate, false, false);                 }                               }             else if (auto_switch_status.cur_state == 1)             {                 auto_switch_status.test_times_cnt++;                 TestTimes.Text = auto_switch_status.test_times_cnt.ToString();                 auto_switch_status.cur_state = 0;                                  SendKeys.Send(" ");                 MessageInfo.Text += "TEST1r ";             }         }     } }
  另外声明,关于SetWaitableTimer和CreateWaitableTimer我是参考如下链接的:
  希望可以帮到大家,上面代码在我自己的笔记本以及客户的笔记本是可以适用的。

面向前端开发人员的VSCode自动化插件编程是复杂的。在保证高生产力和代码质量的同时,有许多最优的方案需要记住,有许多准则需要遵循,还有许多已知问题需要避免。现代开发过程如果没有自动化完成的工作,还是比较困难的。在本文中技术分享每个开发人员都应知道的字符编码知识编码介绍及历史我们都知道计算机只能理解二进制数据暨0和1,二进制是计算机语言,这是因为计算机在设计之初是由八个晶体管通过开合来表示数据的,于是这八位二进制数据被称为字节,一个字节根技术分享表格技术解决方案金融行业在我国金融机构数字化转型的进程中,金融科技通过实行全流程的数字化改造智能化升级和模块化拆分,初步完成了技术对持牌业务的支持与优化。然而,金融数字化转型作为一项复杂的系统工程,很难一万物互联的背后,有一座数据围城物联网之父KevinAshton在近期的一次访谈中表示物联网的真正意义,不在于收集存储数据。更多场景下,在于正确高效地利用数据。之所以提出这个观点,是因为现阶段的物联网也被称作数据技术分享可视化智能预警为生产运行保驾护航随着大数据技术在生产领域的深入应用,智能分析可以基于生产过程中的海量数据,探索生产过程的规律,从而监控整个生产过程,遏制生产事故,为生产运行提供有效数据支持。因此,智能分析对生产型SpreadJS纯前端表格控件应用案例项目投资收益管理系统项目背景明源云深耕地产行业多年,依托行业最佳实践及前沿技术,自主研发了多款数字化创新方案与产品,提供企业级云ERP整体解决方案,赋能于房企智能化运营和数字化创新能力,打通信息孤岛连ActiveReports用户案例特来电报表控件赋能新能源行业一用户简介特来电新能源股份有限公司(简称特来电)是中国最大最强的新能源汽车充电网运营商,主要从事新能源汽车充电网的建设运营以及互联网增值服务。目前,特来电已经建成中国最大的充电网车ActiveReports用户案例微试云Wetrial临床医疗信息一体化平台项目背景为解决临床试验项目管理中的信息孤岛问题,微试云以项目为核心,连接项目中的每一个个体与组织,在一个信息平台上实现信息共享连接互动,产生高效的网状协同关系,达到多组织个性化管理同方知网SpreadJS助力企业内部OA办公系统搭建近日,同方知网借助葡萄城SpreadJS纯前端表格控件升级优化了内部OA办公系统,进一步推动了系统向移动端和云端渗透,提升了其智能化应用程度,加强了企业内外部和业务流程协作。该系统译Gartner2021分析及商业智能魔力象限报告Gartner信息技术研究和分析公司成立于1979年,作为一家中立的咨询机构,Gartner面向大型企业和发展中公司提供深入业务场景和技术领域的洞察分析,为客户推进信息化建设工作保聊聊摄影系列川岛小鸟总结篇川岛小鸟到今天为止,一共写了十五篇川岛小鸟所拍摄的写真分享。基本上是每天一篇,已经坚持了半个月了。这半个月以来,通过各方面的搜集资料,写真模特演员素人等的资料,和摄影师川岛小鸟的资
threezero小比例G1风格擎天柱公布!可动性绝了threezero在MDLX系列首款小比例大黄蜂公布之后不久,终于公布了这个系列的第二弹,不出意料果然是我们的擎天柱大哥。所有配件一览图,擎天柱主体一个,领导模块一个,能量斧一把,不到1kg的笔记本,那才是真的为出行减负以前办公都是用纸和笔,而现在是数字时代,办公基本使用电脑来替代。要么使用台式电脑,要么就是使用笔记本电脑。对于一个普通的办公人员来说,台式电脑已经足够了,可是对于一个商务人士来说,惠普星13Air女生携带也非常轻松上大学后,很多学习内容需要在电脑上编辑,所以需要买一款电脑。学习的同时,是否也希望在无聊的时候能够娱乐一下?那么是应该买台式电脑?还是笔记本电脑呢?越来越多的人,开始摒弃台式电脑,携带方便又响亮的音箱,才是跳广场舞的好伙伴一说到户外音箱,那么很多人第一反应就是户外广场舞那种,因为,只要音乐一开,那么大叔大妈们就跟着舞动起来。音乐越是震撼,那小舞步跳的就更有节奏感,毕竟音乐不仅能放松我们的心情,还能提手机遇水也不慌,IP68级防护更有安全感手机几乎每个人都有一部,很多人会在买手机后,给手机贴上贴膜和戴上保护壳,因为这样的话可以增强手机的防护能力,大幅降低意外受损概率,延长手机的使用寿命。但是手机除了碎屏外,最大的损坏出差用网烦恼多,自带网络笔记本办公更轻松网络,大家第一反应肯定是有线网络和WIFI,因为这个是最常用的两种网络,无论在家里,还是在办公室以及公共场所,都是使用这两种网络。当然很多人想到手机的移动网络,也是一种网络的存在。力荐!直呼奥利给!这8个视频压缩神器你不得不知我们创作完视频往往都会面临一个普遍的问题,视频体积太大了,这导致无法上传各大媒体平台,所以视频压缩就变成了一件必须要做的事了,网上也试过很多视频压缩软件,好一点的都需要付费,免费的全国首例!涉微信红包和微信表情著作权纠纷案!吃瓜一线2019年7月29日,北京互联网法院宣判了一起国内首例涉及微信红包和微信表情著作权纠纷的案件,认定被告吹牛软件构成侵权和不正当竞争,判令被告赔偿腾讯公司共计90万元。吹牛软件是一款干货商标注册成功后,商标权利被终止?为什么?通常,我们说的商标权,是指商标所有人对其商标所享有的独占的排他的权利。这种权利是经过商标所有人申请经过国家商标局所确认的专有权利,这一过程可以理解为R标的申请过程,只有R标才能享受双11李佳琦薇娅直播间爆满!刚注册直播商标的平台还来得及?一年一度的双十一购物狂欢节(吃土节)在10月21日凌晨就已经开始了!!!要不是今天的微博热搜被李佳琦薇娅打工人尾款人等热词占领本打工人是万万没有想到的双十一居然这就开始了?主要原因干货丨构建商标护城河,除了防止他人蹭注,还有这些好处通常不少企业在注册商标时,总会注册一些与主商标相似,能起到一定防御作用的旁支商标。例如,老干妈自己申请的各种妈系列和其他人为了蹭老干妈名气而申请注册的一些商标。还有阿里巴巴申请的各