系统休眠消息PBT_APMSUSPEND

https://msdn.microsoft.com/en-us/library/windows/desktop/aa372721(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/aa372708(v=vs.85).aspx

今天要查找如何获取系统从睡眠、休眠状态下唤醒的消息,写了个MFC对话框的程序,贴出部分核心代码:

[cpp] view plain copy

  1. //唤醒消息捕获
  2. LRESULT CSystemResumedMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  3. {
  4. // TODO: 在此添加专用代码和/或调用基类
  5. if ((message == WM_POWERBROADCAST) && (wParam == PBT_APMRESUMEAUTOMATIC))
  6. {
  7. ShowSystemResumedTips();//捕获唤醒消息后的提示操作
  8. }
  9. return CDialog::WindowProc(message, wParam, lParam);
  10. }

唤醒消息捕获参考了:http://bbs.csdn.net/topics/320261685

之前写过一个实现系统关机、重启、睡眠、休眠的实现,一并贴出代码:

[cpp] view plain copy

  1. /*
  2. MySystemShutdown
  3. 功能:实现系统关机、重启
  4. 参数:
  5. dwShutDownFlag:EWX_SHUTDOWN 关机 EWX_REBOOT 重启
  6. bForce:强制执行
  7. 返回值:成功返回TRUE,否则返回FALSE
  8. */
  9. BOOL MySystemShutdown(DWORD dwShutDownFlag = EWX_SHUTDOWN,BOOL bForce = FALSE)
  10. {
  11. HANDLE hToken;
  12. TOKEN_PRIVILEGES tkp;
  13. // Get a token for this process.
  14. if (!OpenProcessToken(GetCurrentProcess(),
  15. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  16. return( FALSE );
  17. // Get the LUID for the shutdown privilege.
  18. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
  19. &tkp.Privileges[0].Luid);
  20. tkp.PrivilegeCount = 1;  // one privilege to set
  21. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  22. // Get the shutdown privilege for this process.
  23. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
  24. (PTOKEN_PRIVILEGES)NULL, 0);
  25. if (GetLastError() != ERROR_SUCCESS)
  26. return FALSE;
  27. if (bForce)
  28. {
  29. dwShutDownFlag |= EWX_FORCE;//强制终止进程。当此标志设置,Windows不会发送消息WM_QUERYENDSESSION和WM_ENDSESSION的消息给目前在系统中运行的程序。这可能会导致应用程序丢失数据。
  30. }
  31. if (!ExitWindowsEx(dwShutDownFlag,
  32. SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
  33. SHTDN_REASON_MINOR_UPGRADE |
  34. SHTDN_REASON_FLAG_PLANNED))
  35. return FALSE;
  36. return TRUE;
  37. }
  38. /*
  39. MySystemSleep
  40. 功能:实现系统休眠、睡眠功能
  41. 参数:
  42. bHibernate:TRUE休眠 FALSE睡眠
  43. 返回值:成功返回TRUE,否则返回FALSE
  44. */
  45. BOOL MySystemSleep(BOOL bHibernate = TRUE)//
  46. {
  47. HMODULE hModule = NULL;
  48. BOOL bRet = FALSE;
  49. //      BOOLEAN WINAPI SetSuspendState(
  50. //          __in          BOOLEAN Hibernate,
  51. //          __in          BOOLEAN ForceCritical,
  52. //          __in          BOOLEAN DisableWakeEvent
  53. //          );
  54. typedef BOOL (WINAPI *PSetSuspendState)(BOOL Hibernate,
  55. BOOL ForceCritical,
  56. BOOL DisableWakeEvent);
  57. hModule = LoadLibrary(_T("PowrProf.dll"));
  58. if (hModule)
  59. {
  60. PSetSuspendState pSetSuspendState = NULL;
  61. pSetSuspendState = (PSetSuspendState)::GetProcAddress(hModule,"SetSuspendState");//设置备份文件名函数指针
  62. if(pSetSuspendState != NULL)
  63. {
  64. bRet = pSetSuspendState(bHibernate,0,0);
  65. }
  66. FreeLibrary(hModule);
  67. }
  68. return bRet;
  69. }

程序源码连接:http://download.csdn.net/detail/daiafei/8673013

http://blog.csdn.net/daiafei/article/details/45562937

时间: 2024-10-06 21:55:11

系统休眠消息PBT_APMSUSPEND的相关文章

Android socket在系统休眠情况下调研

做了3年的IM应用,一直没有确认过socket在系统休眠的情况下会不会就收不到消息了,网上也搜过一些资料说android手机分为AP和BP两个部分,系统休眠的时候AP是休眠的,而BP是不休眠的,网络协议栈是运行在BP层的,所以当BP收到数据包的时候,系统会唤醒AP,但是AP运行的时间是很短的.虽然听起来很有道理的样子,但是没有亲手测试过,还是一块心病~~~,今天又想起这事,索性动手自己写代码测试看看结果. Server端code: public class TestServer { public

socket在系统休眠情况下调研【转】

做了3年的IM应用,一直没有确认过socket在系统休眠的情况下会不会就收不到消息了,网上也搜过一些资料说android手机分为AP和BP两个部分,系统休眠的时候AP是休眠的,而BP是不休眠的,网络协议栈是运行在BP层的,所以当BP收到数据包的时候,系统会唤醒AP,但是AP运行的时间是很短的.虽然听起来很有道理的样子,但是没有亲手测试过,还是一块心病~~~,今天又想起这事,索性动手自己写代码测试看看结果. Server端code: public class TestServer { public

android计时与系统休眠

android计时与系统休眠 TIP:可能写的有点仓促,具体的可以联系我(*^__^*) 摘要:之前做项目的时候,修改一个倒计时秒表,本来以为比较简单,但是发现很多有趣的东西.我们项目里面用的是Timer计时的方法,但是,当系统休眠的时候,Timer也是处于休眠状态的.后来,我改进了几个方法,一个是handle+message的方法,还有一个是handle+runnable的方法,还有handle+Thread的方法.但是同样发现系统休眠的时候,这些同样是处于休眠状态的.后来上网查找了一下,这和

C#阻止系统休眠

阻止系统休眠 using System.Runtime.InteropServices; static class WinSleepCtr { //定义API函数 [DllImport("kernel32.dll")] static extern uint SetThreadExecutionState(uint esFlags); const uint ES_SYSTEM_REQUIRED = 0x00000001; const uint ES_DISPLAY_REQUIRED =

Android系统休眠对程序的影响以及处理

Android系统在用户长时间不操作时,为了节省资源,系统会选择休眠.在休眠过程中自定义的Timer.Handler.Thread.Service等都会暂停.而有时候这种机制会影响到我们程序的正常运行.那如何避免系统休眠对我们程序的影响呢? 以下已Service服务为例说明在系统休眠的状态下如何唤醒系统并执行我们自定义的Service服务. 一.单次Service服务的开启 1.方法:在需要执行Service服务时获取电源锁,并在执行完毕释放电源锁. 2.代码举例: public class W

模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转)

上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目.有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部分是我自己的理解,有些是直接从网上copy的,有问题大家可以讨论. 1:GetMessage和PeekMessage的区别? GetMessage:获取消息队列中的一个消息,存入MSG中,并从消息队列中移除

系统休眠或浏览器不是当前活动状态,不执行js的解决思路

手机端原生开发,当前页面从系统中被唤起会有相应的事件触发.但webapp确无法获取. 基于浏览器自身规则,在系统休眠或着浏览器不处于当前活动状态是,js是不执行的. 那么如果想让页面能及时更新,解决思路有2个: 一:用一个定时程序,计算当前执行的时间,和上一次执行的时间差,如果大于5m,就看作当前页面背重新激活了. var oldtime = new Date().getTime(); function checkPageActive () { var newtime = new Date().

Linux系统休眠和设备中断处理

一.设备IRQ的suspend和resume 本小节主要解决这样一个问题:在系统休眠过程中,如何suspend设备中断(IRQ)?在从休眠中唤醒的过程中,如何resume设备IRQ? 一般而言,在系统suspend过程的后期,各个设备的IRQ (interrupt request line)会被disable掉.具体的时间点是在各个设备的late suspend阶段之后.代码如下(删除了部分无关代码): static int suspend_enter(suspend_state_t state

Android与iOS系统的消息推送机制

相信大家在使用iPhone版微信的时候都会有这样的经历,微信已经处于关闭状态了(后台进程运行一段时间就被系统杀掉),这时候我们收到了一个消息提醒,打开微信应用,微信显示“连接中…”和“收取中…”,然后再次显示一次刚才系统推送给我的消息通知.对这个现象比较好奇,于是去知乎上查一下资料,发现知乎上的热心人还真多,看了大家的回答之后,总结如下: [之所以去知乎查看技术问题,因为我并非技术人员,而知乎上很多开发人员是会用通俗易懂的方式解释好技术问题的,因为里面有不少大牛.] 先介绍一下两个重要的消息推送