Windows 7 应用程序崩溃恢复
从Vista 到Windows 7 这两款操作系统都带有应用程序恢复和重启(ARR)功能,利用这个特性可以在应用程序处于无响应甚至崩溃状态时,保存当前正在处理的数据,并将应用程序以及之前的数据恢复。本篇我们将利用Windows API Code Pack 来实现这一功能。
首先,我们来创建一个简单的WPF程序。在应用程序加载时需要注册(Register)ARR,当应用程序关闭时也需要将ARR注销。
<Window x:Class="AppRestartRecovery.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid><Button x:Name="crashBtn" Content="Application Crash" Margin="169,104,172,168" Click="crashBtn_Click"/><Button x:Name="closeBtn" Content="Close Application" Margin="169,189,172,83" Click="closeBtn_Click"/></Grid> </Window>
注册ARR
public MainWindow() {InitializeComponent();RegisterForRestartRecovery();... ... }
注销ARR
private void closeBtn_Click(object sender, RoutedEventArgs e) {UnRegisterRestartRecovery();App.Current.Shutdown(); }
在项目中加入Microsoft.WindowsAPICodePack.dll,并添加using Microsoft.WindowsAPICodePack.ApplicationServices; 命名空间。接下来我们开始编写RegisterForRestartRecovery 和UnRegisterRestartRecovery 方法。
在RegisterForRestartRecovery 方法中要分别创建Restart 和Recovery 设置(Settings)。在RestartSettings 中可以设置命令行(“restart”),以及Restart 限制条件。在本例中如果应用程序崩溃是因为PC 重启或安装系统补丁则不会发生Restart 功能。最后要通过ApplicationRestartRecoveryManager 类将Restart 和Recovery 设置分别注册。
private void RegisterForRestartRecovery() {RestartSettings restartSettings = new RestartSettings("restart", RestartRestrictions.NotOnReboot | RestartRestrictions.NotOnPatch);ApplicationRestartRecoveryManager.RegisterForApplicationRestart(restartSettings);RecoveryData data = new RecoveryData(new RecoveryCallback(PerformRecovery), null);RecoverySettings recoverySettings = new RecoverySettings(data, 0);ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(recoverySettings); }
注销方式使用UnregisterApplicationRestar和 UnregisterApplicationRecovery 两种方法即可。
private void UnRegisterRestartRecovery() {ApplicationRestartRecoveryManager.UnregisterApplicationRestart();ApplicationRestartRecoveryManager.UnregisterApplicationRecovery(); }
在应用程序恢复过程中还需要编写一个恢复过程,即RegisterForRestartRecovery 方法提到的PerformRecovery。首先可以通过ApplicationRecoveryInProgress 方法判断恢复过程是否在进行。如果恢复过程被用户取消了,则可以将应用程序进程杀掉,并通过ApplicationRecoveryFinished 方法设置恢复过程是否完成。
private int PerformRecovery(object state) {bool isCanceled = ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress();if (isCanceled){ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(false);}//recovery your work here ...ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true);return 0; }
至此,应用程序的恢复就完成了,大家可以下载代码进行测试。另,当程序启动后要等待60秒再点击“Application Crash” 按键。
源码下载
AppRestartRecovery.zip
转载于:https://www.cnblogs.com/gnielee/archive/2011/01/04/windows7-application-restart-recovery.html
Windows 7 应用程序崩溃恢复相关推荐
- Google Breakpad 在 windows下捕获程序崩溃报告
一.简述 Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,支持Linux.mac.solaris.windows. 通俗一点来讲,我们可以借助Google breakpad来 ...
- BugTrap:程序崩溃快照、bug跟踪之利器
来源:清泛网 http://www.tsingfun.com/html/2016/debug_0412/1354.html BugTrap的github官网地址:https://github.com ...
- 关于Windows程序崩溃(Crash)以及生成dump文件的探究
文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...
- 栈windows linux,Linux+Windows: 程序崩溃时,在 C++ 代码中,如何获取函数调用栈信息...
一.前言 程序在执行过程中 crash 是非常严重的问题,一般都应该在测试阶段排除掉这些问题,但是总会有漏网之鱼被带到 release 阶段. 因此,程序的日志系统需要侦测这种情况,在代码崩溃的时候获 ...
- [异常退出,错误代码0xC0000005]:解决Windows应用程序崩溃的问题
[异常退出,错误代码0xC0000005]:解决Windows应用程序崩溃的问题 每当我们在使用Windows上的应用程序时,突然遇到了程序崩溃显示"[异常退出,错误代码0xC0000005 ...
- windows程序崩溃调试终极武器
windows程序崩溃调试终极武器---dump文件 一.前言 前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑框,如果 ...
- Windows 1709版本中OneDrive导致绝大多数程序崩溃的解决方案
最近微软自动推送了 Windows 1709 版本的更新,其中 OneDrive 的更新导致绝大多数程序崩溃. 例如使用 Typora 软件,通过 Windows 的文件对话框打开保存在 OneDri ...
- windows 设置 java 程序开机启动 + 崩溃重启
前言 有时我们需要把写好的 java 程序部署在 Windows 系统的服务器上,如果服务器被人为重启,或者程序由于未知原因自己崩溃了,程序不能自动重启,用户体验很不好.接下来介绍一种可行的解决方案: ...
- windows 7 如何关闭 程序崩溃时弹出的windows正在检查该问题的解决方案
如果你装的镜像一般不会出现这个问题,因为已经被优化了. 原版的会有这个问题,仅作备份! 尊重原创,原文链接点这里 非常讨厌的东西,每当程序崩溃时,总爱假惺惺的弹出一个对话框 滚上几圈就没有下文了. 尤 ...
最新文章
- 最全 Neo4j 可视化图形数据库的工具!
- HDLBits 系列(29)PS/2 mouse protocol(PS/2 packet parser and datapath)
- 回顾2019年5个重大宕机事件
- 奇异值分解 VS 特征值分解
- 使用yml多环境配置
- CodeForces - 76E Points
- apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数
- 使用截图工具FastStone Capture
- 大数据Hadoop之——任务调度器Oozie(Oozie环境部署)
- 开源办公套件LibreOffice
- SQL 常见面试题解析
- 这15个Java多线程面试题及回答你确定不来看看!
- MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
- android中java中的开方
- java fop_java – 未找到类FOP
- 存储技术(一)-基本概念和技术发展
- linux 查找某个程序,Linux查找特定程序whereis实例详解
- 视频怎么剪辑成短视频?如何制作原创视频素材作品
- NB,用这一篇文章带你了解什么是爬虫?
- 一般纳税人,可以享受哪些税收优惠政策?
热门文章
- 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序...
- 在Spark上用Scala实验梯度下降算法
- linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
- nginx+tomcat动静分离结构
- SIM900A基站定位调试笔记 -转
- ActiveReports 报表中 RDF 文件解析
- 使用nginx在Windows部署网站https服务
- PUSH进栈指令和POP出栈指令
- java final类 能被继承吗_Java中的类被final关键字修饰后,该类将不可以被继承()...
- httpwatchv11.1.46.0免费版