此文已由作者王荣涛授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

首先XP系统和Vista以后的系统,这两个消息的处理方式是不同的。

XP系统

系统发送WM_QUERYENDSESSION,如果你返回FALSE,那么大多数情况下,系统的注销操作会被终止,并且接下来收到的WM_ENDSESSION的wParam参数值为FALSE。按照微软的应用程序设计指导,这个时候你需要出UI告诉用户被终止的原因。

应用程序可以暂时不响应这个消息,比如先不会返回,而是在处理这个消息的代码中弹出一个模态对话框提示用户选择。

默认情况下,你有5秒的时间来处理这个事情。超过5秒后系统出一个对话框提示该应用程序无响应。

如果任意顶层窗口在处理WM_QUERYENDSESSION的时候返回了FASLE,那么注销过程会被取消,之前收到这个消息的窗口又会收到一条WM_ENDSESSION消息,并且它的wParam将为FALSE。

只有当所有顶层窗口收到WM_QUERYENDSESSION之后都返回TRUE,它们才会被一次发送WM_ENDSESSION并且wParam消息为TRUE。一旦进入这一步,注销过程无法撤销。

处理WM_ENDSESSION的时间也是5秒,超过后系统也会弹窗提示。一旦应用程序响应了WM_ENDSESSION消息,Windows会关闭它。接下来,Windows会继续逐个向剩下的应用程序发送WM_ENDSESSION。

Vista以后的系统

相对于XP系统,Vista系统在以下一些方面进行了修改:

  • 未响应应用程序提示的UI方面的改进

  • 允许强制关闭

  • 无法悄悄撤销注销过程(WM_QUERYENDSESSION返回FALSE)

  • 提供阻止关机的API,不使用这些API而仅仅对WM_QUERYENDSESSION返回FALSE是不行的

  • 某些类型的应用程序(比如控制台程序和无可见顶层窗口的程序)将不再被允许阻止关机操作;5秒内对任何消息无响应的程序在关机过程中会被终止

  • 默认超时值修改(主要是减少)

Vista以后系统处理关机的最佳做法

  • 尽量不要阻止关机,这样给用户的体验是最好的

  • 那些必须要阻止关机的应用必须使用新的API:

  • 在系统关机前提前知道需要阻止关机的应用需要在关键代码之前调用ShutdownBlockReasonCreate(),在这块代码后调用ShutdownBlockReasonDestroy();如果在收到WM_QUERYENDSESSION时操作尚未完成,那么返回FALSE

  • 在收到WM_QUERYENDSESSION的时候才知道自己是否要阻止关机的应用程序需要在该消息的处理函数里面调用ShutdownBlockReasonCreate()并返回FALSE,然后在关键工作完成之后调用ShutdownBlockReasonDestroy()

  • 没有可见顶层窗口的应用程序需要使用超过30秒的时间来处理WM_ENDSESSION时需要在收到WM_QUERYENDSESSION的时候调用ShutdownBlockReasonCreate()然后返回TRUE。

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击。

相关文章:
【推荐】 30分钟,让你彻底明白Promise原理

转载于:https://www.cnblogs.com/163yun/p/9803449.html

WM_QUERYENDSESSION与WM_ENDSESSION相关推荐

  1. delphi调用windows api

    在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成).单元Windows.pas 已经由 ...

  2. 系统关机函数ExitWindowsEx详解

    系统关机函数ExitWindowsEx详解 "系统ShutDown"属于Windows系统的一种基本服务.功能上有"关闭系统","注销用户" ...

  3. [转]Windows关机过程分析与快速关机

    Windows开机和关机慢,很多时候慢得令人抓狂.特别是做嵌入式开发时(如XPE和WinCE),任谁都无法忍受开发出来的设备开关机的蜗牛速度.所以我们得为她加速.采用HORM是不错的方案,因为是直接从 ...

  4. Windows核心编程_关闭Windows

    下面介绍几种在Windows编程中关闭Windows的几种方式 首先介绍一个API ExitWindowsEx 这个API是WIndows下为开发人员提供的对操作系统睡眠的几种方式 API介绍: 函数 ...

  5. vc控制计算机关机,192上位机VC MFC实现电脑的重启关机注销功能

    192上位机VC MFC实现电脑的重启关机注销功能.jpg (9.09 KB, 下载次数: 0) 192上位机VC MFC实现电脑的重启关机注销功能 2016-1-29 21:26 上传 192上位机 ...

  6. windows关机,窗口事件

    之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...

  7. IpMsg代码分析(二)

    Ipmsg.cpp为其主要的实现文件,其中调用系统的 int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow)作 ...

  8. Windows关机过程分析与快速关机

    Windows开机和关机慢,很多时候慢得令人抓狂.特别是做嵌入式开发时(如XPE和WinCE),任谁都无法忍受开发出来的设备开关机的蜗牛速度.所以我们得为她加速.采用HORM是不错的方案,因为是直接从 ...

  9. DELPHI 中 Window 消息大全使用详解

    Window 消息大全使用详解 导读: Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能 ...

最新文章

  1. 经典C语言程序100例之九三
  2. 如何使用Oracle的外部表查询警告日志文件
  3. 做完系统回来计算机连接不上网络,重装系统后电脑连不上网怎么回事
  4. 他毕业两年,博客一年,时间
  5. 从零实操基于WSL2 Docker部署Asp.Net Core项目
  6. matlab图像增强分段线性函数_图像增强、锐化,利用 PythonOpenCV 来实现 4 种方法!...
  7. unoconv执行出错unable to connect or start own listener
  8. sim800 模式切换_SIM的完整形式是什么?
  9. 【译】Objectively Speaking 2: A Crash Course in Objective-C for iOS 6
  10. jupyter中subplots_adjust()调整子图大小无效、子图溢出和日期标签遮挡坐标轴刻度的问题解决
  11. Azure vNet
  12. 整体大于部分_怦然心动 Flipped,有多少整体大于全部!
  13. 深入理解Moya设计
  14. UI设计师的成功之路
  15. 【Linux】SOCKET编程
  16. IC/FPGA一文练完
  17. DNA存储技术创造新纪录 存储容量已达200MB
  18. LAMMPS 中 molecule command 的分子模板
  19. API代理连接提取格式
  20. OSPF高级特性 —— 管理距离(优先级)修改 + 外部路由的metric值的修改

热门文章

  1. Linux下安装配置Jenkins
  2. 中国人工智能学会通讯——电子商务中的个性化推荐技术剖析 1. 基于人生阶段建模的商品推荐...
  3. 20135316王剑桥Linux内核学习笔记第三周
  4. Docker监控:基于阿里云容器服务构建自己的Docker监控框架
  5. vue github开源项目_2018 年最好的 45 个 Vue 开源项目汇总
  6. mysqldump全量恢复_mysql全量备份和快速恢复的方法整理
  7. Zookeeper权限控制ACL详解
  8. 设计模式:000设计模式与面向对象介绍
  9. 云服务器cpu系列,云服务器cpu系列
  10. python标准数据库接口是_Python 数据库接口模块_python 数据库模块_python 数据库接口...