从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 应用程序崩溃恢复相关推荐

  1. Google Breakpad 在 windows下捕获程序崩溃报告

    一.简述 Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,支持Linux.mac.solaris.windows. 通俗一点来讲,我们可以借助Google breakpad来 ...

  2. BugTrap:程序崩溃快照、bug跟踪之利器

    来源:清泛网  http://www.tsingfun.com/html/2016/debug_0412/1354.html BugTrap的github官网地址:https://github.com ...

  3. 关于Windows程序崩溃(Crash)以及生成dump文件的探究

    文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...

  4. 栈windows linux,Linux+Windows: 程序崩溃时,在 C++ 代码中,如何获取函数调用栈信息...

    一.前言 程序在执行过程中 crash 是非常严重的问题,一般都应该在测试阶段排除掉这些问题,但是总会有漏网之鱼被带到 release 阶段. 因此,程序的日志系统需要侦测这种情况,在代码崩溃的时候获 ...

  5. [异常退出,错误代码0xC0000005]:解决Windows应用程序崩溃的问题

    [异常退出,错误代码0xC0000005]:解决Windows应用程序崩溃的问题 每当我们在使用Windows上的应用程序时,突然遇到了程序崩溃显示"[异常退出,错误代码0xC0000005 ...

  6. windows程序崩溃调试终极武器

    windows程序崩溃调试终极武器---dump文件 一.前言 前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑框,如果 ...

  7. Windows 1709版本中OneDrive导致绝大多数程序崩溃的解决方案

    最近微软自动推送了 Windows 1709 版本的更新,其中 OneDrive 的更新导致绝大多数程序崩溃. 例如使用 Typora 软件,通过 Windows 的文件对话框打开保存在 OneDri ...

  8. windows 设置 java 程序开机启动 + 崩溃重启

    前言 有时我们需要把写好的 java 程序部署在 Windows 系统的服务器上,如果服务器被人为重启,或者程序由于未知原因自己崩溃了,程序不能自动重启,用户体验很不好.接下来介绍一种可行的解决方案: ...

  9. windows 7 如何关闭 程序崩溃时弹出的windows正在检查该问题的解决方案

    如果你装的镜像一般不会出现这个问题,因为已经被优化了. 原版的会有这个问题,仅作备份! 尊重原创,原文链接点这里 非常讨厌的东西,每当程序崩溃时,总爱假惺惺的弹出一个对话框 滚上几圈就没有下文了. 尤 ...

最新文章

  1. 最全 Neo4j 可视化图形数据库的工具!
  2. HDLBits 系列(29)PS/2 mouse protocol(PS/2 packet parser and datapath)
  3. 回顾2019年5个重大宕机事件
  4. 奇异值分解 VS 特征值分解
  5. 使用yml多环境配置
  6. CodeForces - 76E Points
  7. apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数
  8. 使用截图工具FastStone Capture
  9. 大数据Hadoop之——任务调度器Oozie(Oozie环境部署)
  10. 开源办公套件LibreOffice
  11. SQL 常见面试题解析
  12. 这15个Java多线程面试题及回答你确定不来看看!
  13. MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
  14. android中java中的开方
  15. java fop_java – 未找到类FOP
  16. 存储技术(一)-基本概念和技术发展
  17. linux 查找某个程序,Linux查找特定程序whereis实例详解
  18. 视频怎么剪辑成短视频?如何制作原创视频素材作品
  19. NB,用这一篇文章带你了解什么是爬虫?
  20. 一般纳税人,可以享受哪些税收优惠政策?

热门文章

  1. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序...
  2. 在Spark上用Scala实验梯度下降算法
  3. linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
  4. nginx+tomcat动静分离结构
  5. SIM900A基站定位调试笔记 -转
  6. ActiveReports 报表中 RDF 文件解析
  7. 使用nginx在Windows部署网站https服务
  8. PUSH进栈指令和POP出栈指令
  9. java final类 能被继承吗_Java中的类被final关键字修饰后,该类将不可以被继承()...
  10. httpwatchv11.1.46.0免费版