博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WM_QUERYENDSESSION与WM_ENDSESSION
阅读量:7235 次
发布时间:2019-06-29

本文共 1352 字,大约阅读时间需要 4 分钟。

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

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

首先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+款云产品!

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

相关文章:

【推荐】
【推荐】

转载地址:http://mvlfm.baihongyu.com/

你可能感兴趣的文章
JavaScript[对象.属性.事件]集锦
查看>>
HapiJS开发手冊
查看>>
php操作xml
查看>>
Win 8 加密解密操作,运行时保存值(Session)
查看>>
在旋转有序数组内找特定的值
查看>>
UVa 127 - "Accordian" Patience POJ 1214 链表题解
查看>>
oracle中Window和Window Group
查看>>
WCF NetTcpBinding Transport安全模式(3) ProtectionLevel设置保护级别
查看>>
WinRAR命令行参数[转]
查看>>
Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)
查看>>
使用Container.ItemIndex获取Repeater、Gridview行的序号的简单方法
查看>>
F#系列随笔索引
查看>>
Mac OS X 10.10优胜美地怎样完美接管iphone上的电话和短信
查看>>
dotnet程序优化心得(一)
查看>>
妙趣横生的算法--二叉树
查看>>
发布了Android的App,我要开源几个组件!
查看>>
PHP foreach使用
查看>>
《基于MFC的OpenGL编程》Part 13 Creating 2D and 3D Text
查看>>
HTML5 移动浏览器支持
查看>>
[LeetCode] Next Closest Time 下一个最近时间点
查看>>