如何在 Windows Vista 上禁用“调试/关闭应用程序”对话框?
-
29-08-2019 - |
题
当应用程序在 Windows 上崩溃并且安装了 Visual Studio 等调试器时,会出现以下模式对话框:
[标题:微软Windows]
X 已停止工作
问题导致该程序停止正确工作。Windows将关闭程序并通知您是否有解决方案。
[调试][关闭应用程序]
有没有办法禁用这个对话框?也就是说,程序是否会悄无声息地崩溃并烧毁?
我的情况是,我想运行几个自动化测试,其中一些测试会由于被测应用程序中的错误而崩溃。我不希望这些对话框阻碍自动化运行。
四处搜索,我想我已经找到了在 Windows XP 上禁用此功能的解决方案,该解决方案会删除此注册表项:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
然而,这在 Windows Vista 上不起作用。
解决方案
要强制Windows错误报告(WER)采取崩溃转储和关闭应用程序,而不是提示您调试程序,您可以设置这些注册表项:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"ForceQueue"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent]
"DefaultConsent"=dword:00000001
在此设置,当你的应用程序崩溃,你应该看到* .hdmp和* .mdmp文件:
%ALLUSERSPROFILE%\Microsoft\Windows\WER\
其他提示
请参阅这里:
http://msdn.microsoft.com/en-us/library/ bb513638.aspx
注册表编辑器
DWORD HKLM或HKCU \ SOFTWARE \微软\的Windows \ Windows错误报告\ DontShowUI = “1”
将WER默默的报告。然后就可以设置
DWORD HKLM或HKCU \ SOFTWARE \微软\的Windows \ Windows错误报告\禁用= “1”
从谈话到MS停止它。
我不知道这是否指的是完全一样的对话框,但这里是从的雷蒙德陈:
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
我必须禁用此功能才能在 Windows 64 位 Firefox 上进行发布自动化工作,并且执行了以下操作:
- gpedit.msc
- 计算机配置 -> 管理模板
- Windows 组件 -> Windows 错误报告
- 将“防止显示严重错误的用户界面”设置为启用
这与客户体验报告的完成情况类似:http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm
在我的背景,我只是想抑制弹出我的单元测试,而不是整个系统。我发现功能的结合,需要为了抑制这些错误,如捕捉未处理的异常,抑制运行时检查(如堆栈指针的有效性)和误差模式标志。这就是我取得了一些成功使用的:
#include <windows.h>
#include <rtcapi.h>
int exception_handler(LPEXCEPTION_POINTERS p)
{
printf("Exception detected during the unit tests!\n");
exit(1);
}
int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...)
{
printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName);
exit(1);
}
int main()
{
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler);
_RTC_SetErrorFunc(&runtime_check_handler);
// Run your tests here
return 0;
}
在WPF应用
[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);
[DllImport("kernel32.dll")]
static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
public delegate bool FilterDelegate(Exception ex);
public static void DisableChashReport()
{
FilterDelegate fd = delegate(Exception ex)
{
return true;
};
SetUnhandledExceptionFilter(fd);
SetErrorMode(SetErrorMode(0) | 0x0002 );
}
您必须实现未处理的异常过滤器,只需退出你的应用程序,然后设定的 SetUnhandledExceptionFilter()。
如果您使用的是安全的CRT,你还必须提供自己的参数无效处理程序,并设置该用的 _ set_invalid_parameter_handler ()。
本博客文章有一些信息是如此: http://blog.kalmbachnet.de/?postid=75
在测试期间可以与像ADPlus的一个“调试”附运行一>可以在许多有用的方式进行配置,以收集错误数据(小型转储),但防止你状态的该模式对话框的问题。
如果你想获得一些有用的信息时,在生产中应用崩溃,您可以配置的 Microsoft错误报告来得到类似ADPlus的数据进行处理。
这不是问题的直接答案,因为这是一种解决方法,问题是如何禁用该功能,但就我而言,我是权限有限的服务器上的用户,无法使用以下方法之一禁用该功能其他答案。所以,我需要一个解决方法。这可能至少对其他一些最终解决这个问题的人有用。
我用了 自动热键便携式 并创建了一个宏,每分钟检查一次弹出框是否存在,如果存在,则单击按钮关闭程序。就我而言,这就足够了,并为其他用户保留该功能。它要求我在运行有风险的程序时启动脚本,但它可以满足我的需要。
脚本如下:
sleep_duration = 60000 ; how often to check, in milliseconds.
; 60000 is a full minute
Loop
{
IfWinExist, ahk_class #32770 ; use autohotkey's window spy to confirm that
; ahk_class #32770 is it for you. This seemed to be consistent
; across all errors like this on Windows Server 2008
{
ControlClick, Button2, ahk_class #32770 ; sends the click.
; Button2 is the control name and then the following
; is that window name again
}
Sleep, sleep_duration ; wait for the time set above
}
编辑: 一个快速的旗帜。当其他事情发生时,这似乎试图激活前台窗口中的控件 - 它应该将其发送到后台的程序。如果我找到修复程序,我将编辑此答案以反映它,但现在,请谨慎使用此答案并尝试同时在计算机上执行其他工作。
乱投医在互联网上其他人摆脱只是在时间调试后,我发现,实际工作的简单方法,希望可以帮助别人。
转到控制面板 转到管理工具 转到服务 往下看名单计算机调试管理器 右键点击它,然后单击属性 在常规选项卡,找到启动类型设置 点击禁用。 点击应用和确定。
我还没有看到因为调试消息,以及我的计算机是完全运行状态。
除了更改注册表中的值,你可以完全地禁用的Windows Server 2008 R2,Windows Server上的错误报告2012和Windows 8:serverWerOptin /disable
https://technet.microsoft。 COM / EN-US /库/ hh875648(v = ws.11)的.aspx