как отключить диалоговое окно «отладка / закрытие приложения» в windows vista?

<p>когда в windows происходит сбой приложения и устанавливается отладчик, например visual studio, появляется следующее модальное диалоговое окно:</p><blockquote> <p>[название: microsoft windows]</p> <p>х перестал работать</p> <p>из-за проблемы программа перестала работать правильно. windows закроет программу и уведомит вас, если решение доступно.</p> <p>[отладка] [закрыть приложение]</p> </blockquote><p>есть ли способ отключить этот диалог? то есть программа просто аварийно завершает работу и горит?</p><p>мой сценарий состоит в том, что я хотел бы запустить несколько автоматических тестов, некоторые из которых потерпят крах из-за ошибок в тестируемом приложении. я не хочу, чтобы эти диалоги останавливали запуск автоматизации.</p><p>осматривая вокруг, я думаю, что нашел решение для отключения этого в windows xp, которая обнуляет этот ключ reg:</p><blockquote> <p>hklm\software\microsoft\windows nt\currentversion\aedebug\debugger</p> </blockquote><p>однако это не сработало в windows vista.</p>

<p>чтобы заставить windows error reporting (wer) делать аварийный дамп и закрывать приложение, вместо того, чтобы предлагать отладку программы, вы можете установить следующие записи реестра:</p><pre><code>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 </code></pre><p>после того, как это установлено, при сбое приложений вы должны увидеть файлы * .hdmp и * .mdmp в:</p><pre><code>%allusersprofile%\microsoft\windows\wer\ </code></pre>

<p>посмотреть здесь:</p><p> <a href="http://msdn.microsoft.com/en-us/library/bb513638.aspx">http://msdn.microsoft.com/en-us/library/bb513638.aspx</a> </p><p>смерзаться</p><p>dword hklm или hkcu\software\microsoft\windows\отчеты об ошибках windows\dontshowui = "1"</p><p>заставлю быть молча отчитаться. тогда вы можете установить</p><p>dword hklm или hkcu\software\microsoft\windows\отчеты об ошибках windows\disabled = "1"</p><p>чтобы он не разговаривал с ms.</p>

<p>я не уверен, относится ли это к точно такому же диалогу, но вот альтернативный подход от <a href="http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx">раймонд чен</a> :</p><pre><code>dword dwmode = seterrormode(sem\_nogpfaulterrorbox); seterrormode(dwmode | sem\_nogpfaulterrorbox); </code></pre>

<p>мне пришлось отключить это для работы по автоматизации выпуска на 64-битной windows для firefox, и я сделал следующее:</p><ul> <li>gpedit.msc</li> <li>конфигурация компьютера -> административные шаблоны</li> <li>компоненты windows -> отчеты об ошибках windows</li> <li>установите "запретить отображение пользовательского интерфейса для критических ошибок" на включено</li> </ul><p>это похоже на то, что было достигнуто для отчетов об опыте работы с клиентами в: <a href="http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm">http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7. htm</a> </p>

<p>в моем контексте я хочу подавить всплывающее окно только для моих модульных тестов, а не для всей системы. я обнаружил, что комбинация функций необходима для подавления этих ошибок, таких как перехват необработанных исключений, подавление проверок во время выполнения (таких как достоверность указателя стека) и флагов режима ошибок. вот что я использовал с некоторым успехом:</p><pre><code>#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; } </code></pre>

<p>в приложении wpf</p><pre><code>[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 ); } </code></pre>

<p>это не прямой ответ на вопрос, поскольку это обходной путь, и вопрос заключается в том, как отключить эту функцию, но в моем случае я являюсь пользователем на сервере с ограниченными разрешениями и не могу отключить эту функцию с помощью одного из другие ответы. итак, мне был нужен обходной путь. это, вероятно, будет работать, по крайней мере, для некоторых других, которые в конечном итоге на этот вопрос.</p><p>я использовал <a href="http://www.autohotkey.com">autohotkey portable</a> и создал макрос, который раз в минуту проверяет, существует ли всплывающее окно, и, если он есть, нажимает кнопку, чтобы закрыть программу. в моем случае этого достаточно, и эта функция остается для других пользователей. это требует, чтобы я запускал скрипт, когда я запускаю программу с повышенным риском, но он работает для моих нужд.</p><p>сценарий выглядит следующим образом:</p><pre><code>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 } </code></pre><p><strong> edit: </strong> быстрый флаг. когда все остальное не работает, кажется, что это пытается активировать элементы управления в окне переднего плана - он должен отправить его в программу в фоновом режиме. если я найду исправление, я отредактирую этот ответ, чтобы отразить его, но сейчас, будьте осторожны, используя это и пытаясь одновременно выполнять другую работу на компьютере.</p>

<p>вы должны реализовать фильтр необработанных исключений, который просто закроет ваше приложение, а затем установить эту функцию фильтра с помощью <a href="http://msdn.microsoft.com/en-us/library/ms680634.aspx">setunhandledexceptionfilter ()</a> .</p><p>если вы используете безопасный crt, вы также должны предоставить свой собственный недопустимый обработчик параметров и установить его с помощью <a href="http://msdn.microsoft.com/en-us/library/a9yf33zb(vs.80).aspx">\_ set\_invalid\_parameter\_handler</a> ().</p><p>в этом сообщении также есть некоторая информация: <a href="http://blog.kalmbachnet.de/?postid=75">http://blog.kalmbachnet.de/?postid=75</a> </p>

<p>во время теста вы можете запустить с <a href="http://msdn.microsoft.com/en-us/magazine/cc163833.aspx">'отладчик', такой как adplus attached</a> , который может быть настроен многими полезными способами для сбора данных (мини-дампов) об ошибках, и в то же время предотвращает проблемы модального диалога, о которых вы говорили выше.</p><p>если вы хотите получить полезную информацию, когда ваше приложение выходит из строя на рабочем месте, вы можете настроить <a href="http://msdn.microsoft.com/en-us/library/bb219076.aspx">отчет об ошибках microsoft</a> , чтобы получить что-то похожее на данные adplus.</p>

<p>попробовав все остальное в интернете, чтобы избавиться от отладчика, как раз вовремя, я нашел простой способ, который действительно сработал, и я надеюсь, что поможет кому-то еще.</p><p>перейдите в панель управления. перейдите в раздел "администрирование". перейдите в раздел "службы". просмотрите список диспетчера отладки машины. щелкните правой кнопкой мыши на нем и выберите "свойства". на вкладке "общие" найдите "тип запуска". нажмите "отключить". нажмите применить и ок.</p><p>с тех пор я не видел сообщения отладчика, и мой компьютер работает отлично.</p>

<p>вместо изменения значений в реестре вы можете полностью отключить отчеты об ошибках в windows server 2008 r2, windows server 2012 и windows 8 с помощью: <code>serverweroptin /disable</code></p><p> <a href="https://technet.microsoft.com/en-us/library/hh875648(v=ws.11).aspx">https://technet.microsoft.com/en-us/library/hh875648 (v = ws.11) .aspx</a> </p>