安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

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

8月24日 蚀肉堂投稿
  最近碰到一个关于芯片测试过程中的问题,这颗芯片是用在笔记本端口上,笔记本客户那边会有一个压力测试,就是频繁的电脑电源状态切换,S0(正常使用的开机状态),S3(睡眠模式),S4(休眠模式)以及S5(关机模式)。
  当然,主要是客户在压力测试过程中,发现了芯片会不正常的死锁,客户那边将机台寄回来,那么该如何复现呢?客户那边会有自己的一套压力测试系统,不过会测试很多东西,不太方便给我们,而且每一次循环耗时比较久。那么,能不能自己搭建一套控制电脑睡眠,休眠,关机以及唤醒的程序呢?
  上面讲的是一个应用背景,告诉大家这其实也是有需求的,只是平时不太用而已,将其记录下来:
  首先,从电脑开机状态S0切换到S3,S4甚至是S5,都是比较容易实现的,见下面代码:Application。SetSuspendState(PowerState。Suspend,false,false);从S0进入S3Application。SetSuspendState(PowerState。Hibernate,false,false);从S0进入S4Process。Start(shutdown,st0);参数s的意思是要关闭计算机参数t0的意思是告诉计算机0秒之后执行命令Process。Start(shutdown,rt0);参数r的意思是要重新启动计算机
  只要调用上述语句即可实现从S0到其他的电源状态,那么反过来唤醒呢?
  唤醒的难点在于:当处于S3,S4以及S5的状态下,我的上位机程序是不会运行的,因此,在上位机软件的定时唤醒也是没法工作的。那么笔记本客户那边是怎么操作的呢?他们会通过底层的EC控制来显示上述的功能,可是,我们是不知道底层EC的接口,而且,我们需要一个通用的程式,那要怎么实现呢?
  在笔记本的设计中,在S3,S4,S5通常不是所有的东西都会关掉,通常会有一个硬件定时器还在开着,如果我们能操作这个定时器,那是不是就可以实现我们想要的功能呢?
  可以调用下面的两个函数,即CreateWaitableTimer以及SetWaitableTimer,这两个函数就可以控制电脑里面开的硬件定时器,当然这个硬件定时器是CPU里面的还是EC里面的,我也不太清楚,没研究过,如果有大神研究过,可以留言,我也学习学习。〔DllImport(kernel32。dll)〕publicstaticexternSafeWaitHandleCreateWaitableTimer(IntPtrlpTimerAttributes,boolbManualReset,stringlpTimerName);〔DllImport(kernel32。dll,SetLastErrortrue)〕〔return:MarshalAs(UnmanagedType。Bool)〕publicstaticexternboolSetWaitableTimer(SafeWaitHandlehTimer,〔In〕reflongpDueTime,intlPeriod,IntPtrpfnCompletionRoutine,IntPtrlpArgToCompletionRoutine,boolfResume);
  另外,需要说明的一点是,使用这个定时器也是有条件的,你需要先设置笔记本,ControlPanelPowerOptionsChangePlanSettingsChangeAdvancedPowerSettingsSleepAllowWakeTimers,使能定时器唤醒,还有就是,ControlPanelPowerOptionsChangePlanSettingsChangeAdvancedPowerSettingsBradAdditionalSettingsRequireapasswordonwakeup,关闭唤醒需要密码。
  完成上面的设置,其实已经可以实现电脑从S3,S4,S5唤醒了,但在我使用的过程中,其实还碰到了一个问题,就是唤醒之后,屏幕不亮,你就会误认为没有唤醒,因此我增加了控制鼠标移动的命令,这样,唤醒之后,屏幕就会亮起。〔DllImport(user32。dll)〕publicstaticexternvoidmouseevent(Int32dwFlags,Int32dx,Int32dy,Int32dwData,UIntPtrdwExtraInfo);mouseevent(0x0001,0,1,0,UIntPtr。Zero);mouseevent(0x0001,0,1,0,UIntPtr。Zero);
  另外还有一点需要注意,就是笔记本从S0S3S4S5S0这个循环里面,S0,S3S4S5这几个状态的停留时间一定要足够,因为,每个笔记本的完全进入各个状态的时间会不一样,比如,我用我自己的笔记本,这几个状态的停留时间要至少20s,否则,笔记本还没有完全进入就要退出,就会导致,电脑把WaitableTimer关掉,而笔记本还没有唤醒,导致程式死锁。而新的刚买的笔记本,只需要设置10s即可完全进入。
  废话不多说,直接上代码:usingSusingSystem。Collections。GusingSystem。ComponentMusingSystem。DusingSystem。DusingSystem。LusingSystem。TusingSystem。Threading。TusingSystem。Windows。FusingSystem。TusingMicrosoft。Win32。SafeHusingSystem。Runtime。InteropSnamespaceAutoSwitchGUI{publicpartialclassAutoSwitchGUI:Form{〔DllImport(kernel32。dll)〕publicstaticexternSafeWaitHandleCreateWaitableTimer(IntPtrlpTimerAttributes,boolbManualReset,stringlpTimerName);〔DllImport(kernel32。dll,SetLastErrortrue)〕〔return:MarshalAs(UnmanagedType。Bool)〕publicstaticexternboolSetWaitableTimer(SafeWaitHandlehTimer,〔In〕reflongpDueTime,intlPeriod,IntPtrpfnCompletionRoutine,IntPtrlpArgToCompletionRoutine,boolfResume);〔DllImport(kernel32。dll)〕publicstaticexternuintSetThreadExecutionState(uintesFlags);〔DllImport(user32。dll)〕publicstaticexternvoidmouseevent(Int32dwFlags,Int32dx,Int32dy,Int32dwData,UIntPtrdwExtraInfo);publiceventEventHandlerWprivateBackgroundWorkerbgWorkernewBackgroundWorker();publicstructautoswitchguistatust{publicUInt64publicUInt64publicints0publicints3}publicAutoSwitchGUI(){InitializeComponent();bgWorker。DoWorknewDoWorkEventHandler(bgWorkerDowork);bgWorker。RunWorkerCompletednewRunWorkerCompletedEventHandler(bgWorkerRunWorkerCompleted);}privatevoidbgWorkerDowork(objectsender,DoWorkEventArgse){longwaketime(long)e。Ausing(SafeWaitHandlehandleCreateWaitableTimer(IntPtr。Zero,true,this。GetType()。Assembly。GetName()。Name。ToString()Timer)){if(SetWaitableTimer(handle,refwaketime,0,IntPtr。Zero,IntPtr。Zero,true)){using(EventWaitHandlewhnewEventWaitHandle(false,EventResetMode。AutoReset)){wh。SafeWaitHwh。WaitOne();}}else{thrownewWin32Exception(Marshal。GetLastWin32Error());}}}privatevoidbgWorkerRunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){mouseevent(0x0001,0,1,0,UIntPtr。Zero);mouseevent(0x0001,0,1,0,UIntPtr。Zero);autoswitchstatus。TestTimes。Textautoswitchstatus。testtimescnt。ToString();SystemTimer。Intervalautoswitchstatus。s0duration1000;SystemTimer。Start();}publicvoidSetWakeUpTime(UInt64time){bgWorker。RunWorkerAsync(System。DateTime。Now。AddSeconds(time)。ToFileTime());}privatevoidStartButtonClick(objectsender,EventArgse){try{autoswitchstatus。testtimesUInt64。Parse(SetTestTimes。Text);autoswitchstatus。s0durationint。Parse(S0Duration。Text);autoswitchstatus。s3durationint。Parse(S3Duration。Text);if(autoswitchstatus。testtimes0){SetThreadExecutionState(0x000000010x000000020x800000000x00000040);TestStatus。BackColorColor。Gautoswitchstatus。TestTimes。Text0;autoswitchstatus。testtimescnt0;SystemTimer。Intervalautoswitchstatus。s0duration1000;autoswitchstatus。curstate0;SystemTimer。Start();}}catch{}MessageBox。Show(ConfigurationFailed!);}privatevoidStopButtonClick(objectsender,EventArgse){SystemTimer。Stop();autoswitchstatus。TestStatus。BackColorColor。R}privatevoidSystemTimerTick(objectsender,EventArgse){if(autoswitchstatus。curstate0){autoswitchstatus。curstate0;SystemTimer。Stop();if(autoswitchstatus。testtimescntautoswitchstatus。testtimes){}else{SetWakeUpTime((UInt64)autoswitchstatus。s3duration);Application。SetSuspendState(PowerState。Suspend,false,false);Application。SetSuspendState(PowerState。Hibernate,false,false);}}elseif(autoswitchstatus。curstate1){autoswitchstatus。TestTimes。Textautoswitchstatus。testtimescnt。ToString();autoswitchstatus。curstate0;SendKeys。Send();MessageInfo。TextTEST1r;}}}}
  另外声明,关于SetWaitableTimer和CreateWaitableTimer我是参考如下链接的:
  希望可以帮到大家,上面代码在我自己的笔记本以及客户的笔记本是可以适用的。
投诉 评论 转载

网络平台,疯疯癫癫的人发出来的视频,为什么热度高?演的人是疯子,看的人是傻子,演是为了有钱花,看是为了看笑话。因为当今吃饱了,喝足了,猎奇心理严重,对奇怪的,搞笑的,泛黄的等怪闻有浓厚的兴趣。网络平台发……IDG资本合伙人李骁军投资履历李骁军履历简介:IDG资本合伙人。李骁军侧重于互联网、移动互联网、高科技领域的投资,在高新技术行业有着丰富的工程管理和创业经验。作为NASDAQ两家上市半导体公司Broadco……买分期手机被骗,一个月要还两个手机的分期付款,而手机只拿了一一听到捷信,就心中的草尼玛,贷款8000,一个月还621,还了一年,告诉我还的是利息,本金8000还没还,草,怕爆通讯录,把剩下的8000又还了,现在经常捷信给我打电话问我贷不……C控制电脑睡眠,休眠,关机以及唤醒最近碰到一个关于芯片测试过程中的问题,这颗芯片是用在笔记本端口上,笔记本客户那边会有一个压力测试,就是频繁的电脑电源状态切换,S0(正常使用的开机状态),S3(睡眠模式),S4……6000mAh旗舰也撑不住了,16256G突降500元,性价ROG应该是游戏手机里堆料很充足的一个品牌了,而且和其他手机动辄降价促销不一样的是,ROG基本上很少降价,即便是降价也不会出现很大的幅度,所以算是游戏手机里保值率比较高的手机。……没人会拒绝大光圈的魅力适马105mmF1。4ART镜头分享2本内容来源于什么值得买APP,观点仅代表作者本人作者:食肉库玛在各个焦段的镜头里,大部分都不只有一个功能,抛去万金油的2470焦段不说。超广角带来的风光壮丽,其边缘的畸变……汽车新闻早报9。229月22日汽车新闻早报,星期三,农历八月十六工信部:研究制定支持新能源汽车加快发展的政策措施,提高锂、钴、镍等关键资源保障能力理想汽车:由于疫情导致毫米波雷达专用芯片严重减产,……贝店爆雷,拉人头的社交电商走入死局钛媒体深度等待了一个月,赵鹏还是没等到贝店的解决方案。8月初,多家媒体报道,杭州贝贝集团疑似资金链断裂,旗下贝店商户账款拖欠数月未能结清,有大量商家聚在贝贝总部大楼讨要债款。赵鹏也……iPhone13和iPhone12哪个性价比更高,怎么选才好iPhone13则是综合素质最高的,在iPhone12的基础上,进一步提升了续航能力、屏幕素质以及拍摄能力。再加上新款光环,这部分提升多花个1000元也不算过分。总体上性价比略……红魔运动智能手表体验佩戴轻盈外观简约,给续航竖大拇指大家好,我是酷玩小新。今天和大家聊聊智能手表。如今,智能穿戴设备发展得越来越快,也越来越火爆,市面上涌现出各式各样的智能手环和智能手表,而后者相对于前者来说,更受年轻人喜……京华ampampamp飞利浦携多款智能AI设备及整体解决方案2020年11月23日,以聚焦科技最前沿智领警务新时代为主题的2020第十届中国国际警用装备博览会(以下简称警博会)在北京国家会议中心展开。结合警博会在公共安全领域传播专业理念……物联网相关白皮书IOT安全威胁报告(2018)腾讯。pdf2020年联网智能设备安全态势报告。pdf2020物联网安全年报绿盟。pdf2021年中国ALoT产业全景图谱报告物……
惊险!150万特斯拉高速失控,车主大怒必须道歉!刚刚,特斯拉乌克兰出现的滴滴打仗战法是不是互联网时代的游击战模式?移动存储利器东芝2TB移动硬盘399元挂耳不入耳,听力零损伤,SanagA5S气传导耳机体验全球黑客卷入乌俄乱局!数字网络战的背后值得深思当前人类健康最大的敌人是什么?面对亚马逊封号,中国卖家应该如何破局?荣耀Earbuds2SE体验评测!32小时超长续航,好看好听英语学科可以取消了从蔚来事件说起,汽车汉化有必要吗西数并购全球第二大闪存芯片厂商铠侠,将对市场产生怎样的影响?腾讯QQ堂今日正式停运银行工作计划别让减肥变成厌食症短发外翘卷发发型设计最新韩式流行短发发型安徒生童话胡萝卜罐头的故事你不知道的小技巧直逼性高潮的背入式做爱体位特殊的绑架红豆薏米粥经期能够吃吗高校如何更好实现教育科技人才一体推进刘正风金盆洗手为什么不肯撒谎?珍珠泉教案图诺基亚e97怎么样跨时代的好产品亲子鉴定人数激增,担心妻子不安分?网友想出好对策

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利