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

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我是参考如下链接的:
  希望可以帮到大家,上面代码在我自己的笔记本以及客户的笔记本是可以适用的。

米哈游投资造火箭马斯克裁员高招曝光三星拍月亮是照骗日报君发自凹非寺量子位公众号QbitAI大家好,今天是3月13日星期一,新的一周开始了。先来和日报君一起看看最近科技圈都发生了哪些大事吧马斯克辞退高薪员工伎俩曝光为了省钱,马斯克可携程发布2022财报净利润14亿元,实现由亏转盈冷眼看财报2022年3月7日,携程集团公布了截至2022年12月31日第四季度及全年的财务业绩。财报显示,2022年携程集团全年净营业收入为200亿元,同比保持稳定,约恢复至2019年的56退休人员养老金连续上调,2023年养老金调整,会提低控高吗?视频加载中所谓养老金调整的提低控高,指的是基本养老金水平高的退休人员少涨养老金,基本养老金水平低的退休人员多涨养老金。近年来养老金调整时,不少退休人员抱怨基本养老金水平低,养老金上总莫名将我视为队内的毒瘤,你有多了解我欧文发声回怼黑粉不久前,欧文来到独行侠后发布了有些令人疑惑的推文。这一行为也让欧文被推上了风口浪尖,人们担心他会像在篮网和凯尔特人一样,并指责欧文不专心投入到训练中,而是弄出一些有的没的。我想说的用4年青春换3600万!萧涛涛加盟秘鲁老东家,恢复秘鲁国籍秘鲁体育大学宣布,萧涛涛正式回归,签约至2024年。据秘鲁广播电台RPP消息,萧涛涛恢复秘鲁国籍,在老东家秘鲁体育大学取得注册。萧涛涛,原名罗伯托萧初(RobertoSiucho)祝贺!大满贯赛国乒连赢8场,7大主力全胜不败,暂时无人输外战北京时间3月11日下午,乒乓球WTT新加坡大满贯赛传来喜讯在首个正赛日的上半场战斗中,国乒钱天一陈幸同樊振东王曼昱张瑞王楚钦梁靖崑王艺迪林高远先后登场,取得了8战8捷的胜利,至今还代码分享使用R语言构建ceRNA网络(circRNAmRNA)生信碱移轻松构建ceRNA网络ceRNA网络是一种新型的基因调控机制,可以通过共享microRNA(miRNA)来影响彼此的表达,导致疾病或某种表型的改变。在这篇文章中,我将分享使总投资1802亿,重庆市九龙坡区2023年区级重点项目名单九龙坡区2023年区级重点项目名单序号项目名称总投资1802亿元,年度投资288亿元1hr中国联通(重庆)5G融合创新中心2hr清研理工创业大街3hr重庆国创轻合金研究院市级新型高为什么我考公务员考编的时候没人告诉我这些?一直觉得生命的意义在于自由,去看山看海,去读自己想读的书,去奋不顾身的爱人,拥有自己的灵魂和思想,哪怕平凡也会觉得有价值。我记得那年当我考完省考后又马不停蹄的准备事业单位考试,每天岁月苍凉,记忆成殇情感点评大赏冷月无声,郁问苍穹,何物拟情浓?林间双燕往来匆,嬉戏暖融。窗外啼莺,春枝已盛,何日与君逢题记游走在时间的边缘,飘摇的风,浮动着忧伤的残梦,岁月无言,回望,那些擦肩的缘,没有动态的日子里,在好好的生活某个瞬间突然想起某些好久没联系的好友,点开头像,白色的背景页写着朋友仅展示最近三天的朋友圈打开对话框,时间停留在去年的二月份,原来已经有一年没联系了,什么时候从无话不说变成了打开对
物联网云监控web设备管理iot源码,MQTTONENET带APP端源码大型物联网平台全套源码物联网云监控IOT设备管理源码带APP端开发语言PHP数据库MYSQL开发工具phpstrom源码类型全开源免费分享源码描述物联网云监控web设备管理iot源3个设备的完美搭配,森歌i8集成灶值得入手相信现在有许多人会独立选择烟灶抽油烟机蒸烤箱,这样的好处的就是能够搭配出自己喜欢的风格,那么还有一部分人是不喜欢这样的选择,更喜欢简单一些的,那么森歌集成灶设备就更加适合你。无缝切首钢放弃执行球队选项,刘晓宇成自由市场上的香饽饽,花落谁家?在被吉林以下克上以后,很多球迷都知道北京首钢推倒重建的时候还是到来了,虽然之前北京首钢方面推倒重建的意愿好像不是特别的大,但是随着时间的进行北京首钢还是决定推倒重建了。据最新消息来热火G6胜绿军,6慢镜3细节对比,斯波的调整压制了乌杜卡文水清清所有人都会深信绿军会终结系列赛的情况下,热火却以111103扳平东决大比分,将系列赛拖入抢七大战,那么他们是怎么做到的呢?6慢镜3细节印证,斯波的调整压制了乌杜卡。巴特勒4利用网络兑券系统漏洞侵财属于诈骗行为姚景俊随着互联网技术大数据数字结算和人工智能的深入发展,线上平台与线下商家及商家App客户端等之间的合作关系愈发紧密。线上线下相融合的交易模式在给人们带来便捷消费体验的同时,也产生知识产权宣传周典型案例三明确网络服务提供者信息披露义务标准知识产权典型案例(三)北京智者天下科技有限公司与林某南著作权权属侵权纠纷案基本案情林某南是高中英语单词串记法书号为ISBN9787510062346的编著者,对书籍内容享有著作权。202229为了不断提高用户使用的体验,开发团队正在对产品进20220529为了不断提高用户使用的体验,开发团队正在对产品进行全方位的开发和优化。已知开发团队共有若干名成员,skillsi表示第i名开发人员掌握技能列表。如果两名成员各自拥有苹果今年最牛改进,iOS16必更下个月就是苹果的WWDC开发者大会。不知不觉,这已经是苹果第26届开发者大会,本次大会上,苹果将会发布诸多新系统版本,最备受关注的或许是iOS16和iPadOS16。看着网上各种i红米新机曝光霸榜全球前十销量的它,下月来以前安卓高端旗舰机是很少能与苹果手机来扳手腕,经过不断配置系统迭代以及自研技术的加持,以华米OV为代表的优秀厂商腰板挺直了起来,不少手机厂商经过良性的竞争,让手机行业有了突飞猛进的618可以闭眼买的3款手机,几乎零差评,覆盖高中低三档618可以闭眼买的3款手机,几乎零差评,覆盖高中低三档第一款iPhone13Pro并不是说我不推荐国产手机,而是在618期间,国产高端手机真的没有能拿得出手的,iPhone手机的销还记得当年的网络资费要求全面下调吗?本来已经忘了伤痛。最近又有报道网络资费下调的报道。就是这些不属实的报导刺痛了我的同时又错误地带了风向。从最开始的资费全国人民都觉得得贵到58左右三大运营商都差不多这个价去享受一个5