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


本文转自Gnie博客园博客,原文链接:http://www.cnblogs.com/gnielee/archive/2011/01/04/windows7-application-restart-recovery.html,如需转载请自行联系原作者
相关文章
|
9天前
|
消息中间件 编译器 API
Windows窗口程序
Windows窗口程序
|
11天前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
29天前
|
Windows
实现Windows程序的数据更新
实现Windows程序的数据更新
12 0
|
29天前
|
Windows
构建布局良好的Windows程序
构建布局良好的Windows程序
11 0
|
29天前
|
C# Windows
初识Windows程序
初识Windows程序
10 0
|
2月前
|
Java Linux Windows
windows实现自动部署jar包运行程序
windows实现自动部署jar包运行程序
39 0
|
4月前
|
移动开发
【实用】一组原创原生样式的基础控件、UI组件样式(偏向移动端H5页面的样式)
【实用】一组原创原生样式的基础控件、UI组件样式(偏向移动端H5页面的样式)
【实用】一组原创原生样式的基础控件、UI组件样式(偏向移动端H5页面的样式)
|
3月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
89 1
|
1月前
|
数据可视化 数据库 C++
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
|
2月前
|
Windows
火山中文编程 -- 第一个windows程序
火山中文编程 -- 第一个windows程序
12 0