如何可靠触发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
相关产品推荐
相关产品推荐

