You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何可靠触发Windows错误恢复?已注册RegisterApplicationRecoveryCallback回调

如何触发RegisterApplicationRecoveryCallback注册的恢复回调

为什么无限循环无法触发恢复对话框

Windows错误报告(WER)不会自动对单纯的无限循环无响应程序触发恢复流程——这类场景下系统只会弹出“程序无响应”的结束任务对话框,默认不会启动WER的恢复机制,也就不会调用你注册的RegisterApplicationRecoveryCallback回调。而你提到的崩溃触发方式又被独立进程拦截,所以需要其他方法手动触发。

可行的验证方法

方法一:主动调用WER API触发恢复流程

直接在代码中调用WER相关API创建并提交错误报告,强制WER介入并触发恢复回调。示例代码如下:

#include <windows.h>
#include <werapi.h>

// 你的恢复回调函数
void WINAPI MyRecoveryCallback(PVOID pvParameter)
{
    MessageBoxW(NULL, L"恢复回调已执行!", L"验证成功", MB_OK);
    // 通知WER恢复完成
    ApplicationRecoveryFinished(TRUE);
}

int main()
{
    // 注册恢复回调
    if (!RegisterApplicationRecoveryCallback(MyRecoveryCallback, NULL, 0, 0))
    {
        MessageBoxW(NULL, L"注册恢复回调失败", L"错误", MB_ICONERROR);
        return 1;
    }

    // 主动创建并提交WER报告,触发恢复流程
    HREPORT hWerReport = NULL;
    if (SUCCEEDED(WerReportCreate(L"MyTestApp", WerReportCritical, &hWerReport)))
    {
        WerReportSubmit(hWerReport, WerReportQueue, NULL);
        WerReportCloseHandle(hWerReport);
    }

    // 等待回调执行
    Sleep(10000);
    return 0;
}

编译时需要链接wer.lib库(例如VS中添加/link wer.lib)。

方法二:调整系统设置,让无响应程序触发WER

修改系统的WER设置,使关闭无响应程序时启动恢复流程:

  • 打开控制面板 → 系统和安全 → 操作中心 → 更改操作中心设置 → 问题报告设置
  • 选择「自动检查解决方案(推荐)」或「每次遇到问题时询问我」
  • 运行你的无限循环程序,当弹出「程序无响应」对话框时,点击「关闭程序」,此时WER会启动并触发你的恢复回调。

方法三:模拟可被WER捕获的异常(绕过拦截)

如果你的崩溃拦截进程只处理特定类型的异常,可以尝试触发未被拦截的异常类型,比如:

// 触发整数除零异常(部分拦截进程可能未处理这类同步异常)
int zero = 0;
int result = 1 / zero;

如果这个异常能绕过拦截,WER会启动并触发恢复回调。

注意事项

  • 注册回调时,可通过RECOVERY_CALLBACK_FLAG_ALLOW_CANCEL参数让恢复对话框显示「取消」按钮,允许用户终止恢复流程:
    RegisterApplicationRecoveryCallback(MyRecoveryCallback, NULL, 0, RECOVERY_CALLBACK_FLAG_ALLOW_CANCEL);
    
  • 恢复回调中必须调用ApplicationRecoveryFinished()通知WER恢复完成,否则WER会强制终止进程。

内容的提问来源于stack exchange,提问作者Sac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:15:15