近日在工作中,接手一个项目,程序运行起来后偶发性间隔几个小时或几天就会出现如下(图1, 图2)的”xx程序已停止工作”的提示窗口,这时需要用户手动点击”关闭程序”按钮,进程才会退出。

图1

图2

当然最好的解决办法就是找出程序中导致”程序错误”的原因,但由于对接手的项目不是很熟悉,再加上时间紧迫,难以在短时间找到问题原因,于是给此程序添加一个”守护程序”(即: 检测到进程退出后就自动重启)。

但程序崩溃时,弹出的”xx程序已停止工作”导致程序进程无法退出,“守护程序”自然也起不到相应的作用。

在网上查找了一番,终于找到两种解决方法:

第一种方法

运行注册表编辑器,依次定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\WindowsError Reporting,在右侧窗口中找到并双击打开DontshowUI,然后在弹出的窗口中将默认值“0”修改为“1”。

那么,当程序崩溃时,就不会再出现”xx程序已停止工作”的提示框,崩溃程序进程会自动退出。

这种修改系统注册表的方法是最方便和直接的,但会对所有程序生效,如果特别注重系统的安全性,只想让指定的程序在崩溃时不出现”xx程序已停止工作”,请参考”第二种方法”。

图3

第二种方法

查看Windows任务管理器(图4)发现,程序崩溃时之所以出现”xx程序已停止”工作,是因为触发了”Windows的错误报告”机制,在我的系统(Windows 10 64位)任务管理器进程列表中会出现一个名称为”Windows问题报告”的进程,点击此进程左侧的”下拉箭头”,会出现一个窗口列表,此窗口列表就代表了当前所有弹出”xx程序已停止工作”的窗口(图5),而窗口标题就是我们崩溃程序的进程名。

图4

图5

看到此,不知道你是否已经有了启发。

解决思路如下:

在”守护程序”中定期检测Windows系统进程列表中是否出现”WerFault

.exe”进程(“Windows问题报告”的进程名), 如果出现, 则查找”WerFault.exe”进程下的窗口名称是否存在”要守护程序的进程名”, 如果存在,则表示“要守护的程序崩溃并出现已停止工作”的提示框, 那么则向“WerFault.exe”进程下的“窗口”发送 WM_Close 消息,关闭此“提示窗口”,如此, “要守护的程序进程就会完全退出”, 守护程序就可以重新启动此程序了。

其实就是用程序模拟“用户手动关闭‘已停止工作’窗口。

#include <windows.h>
#include <tlhelp32.h> //声明快照函数文件
#include "stdio.h"
#include <cstring>// 根据进程ID, 返回指定进程下"第一个"窗口的窗口句柄
// 注: 此程序还不够完善, 因为指定进程下可能有多个窗口
HWND GetWindowHandleByPID(DWORD dwProcessID)
{HWND h = GetTopWindow(0);while (h){DWORD pid = 0;DWORD dwTheardId = GetWindowThreadProcessId(h, &pid);if (dwTheardId != 0){if (pid == dwProcessID /*your process id*/){// here h is the handle to the windowreturn h;}}h = GetNextWindow(h, GW_HWNDNEXT);}return NULL;
}int main(int argc, char *argv[])
{PROCESSENTRY32 pe32;//在使用这个结构之前,先设置它的大小pe32.dwSize = sizeof(pe32);//给系统内的所有进程拍一个快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//Includes the process list in the snapshotif (hProcessSnap == INVALID_HANDLE_VALUE){printf("CreateToolhelp32Snapshot 调用失败! n");return -1;}//遍历进程快照,轮流显示每个进程信息BOOL bMore = ::Process32First(hProcessSnap, &pe32);while (bMore){/*printf(" 进程名称为:%s\n", pe32.szExeFile);printf(" 进程ID为:%u \n\n", pe32.th32ProcessID);*/if (_stricmp(pe32.szExeFile, "werfault.exe") == 0){printf(" 进程名称为:%s\n", pe32.szExeFile);printf(" 进程ID为:%u \n\n", pe32.th32ProcessID);HWND hwnd = GetWindowHandleByPID(pe32.th32ProcessID);if (hwnd){char szText[256] = { 0 };GetWindowText(hwnd, szText, 256);// 自己崩溃程序的"进程名"if (_stricmp(szText, "myProcessName.exe") == 0){printf("Text: %s\n\n", szText);// 关闭"xx程序已停止"提示窗口SendMessage(hwnd, WM_CLOSE, NULL, NULL);}}}//遍历下一个bMore = ::Process32Next(hProcessSnap, &pe32);}//清除snapshot对象::CloseHandle(hProcessSnap);return 0;
}

补充

此程序还不够完善,因为对于下面方法:

HWNDGetWindowHandleByPID(DWORD dwProcessID);

其根据进程ID,返回指定进程下"第一个"窗口的窗口句柄,但一个进程下可能会有多个窗口(如图6)。

图6

但对“WerFault.exe”进程,我在测试中发现(测试系统:Windows10 64位),当有多个程序出现”已停止工作“提示窗口时(图7),每个程序会各自对应一个”WerFault.exe”进程(图8)。即: 每个WerFault.exe进程下只会出现一个“已停止工作”窗口标题。

当然其他Windows系统我没有测试是否也是这样,以后有时间再进一步完善此程序。

图7

图8

参考文章:

修改DontshowUI默认值弹出窗口关闭小秘密

https://www.baidu.com/link?url=hTh2Zy1SF_KozYKGGdD_HRLEUm4jDB5Uv3jaN3GKP9L40M84F7pHl2upszMXA1lqeRgCpNAeusYrMLhr1rq_QlZ3G6qx5Ypc0CLoCZKQ7s3&wd=&eqid=e02a9f000000a25b0000000357ce11b6

VC++ 通过进程名或进程ID获取进程句柄

http://blog.csdn.net/luxiaoyu_sdc/article/details/6534783

VC 显示当前运行的所有进程

http://www.cnblogs.com/xianyunhe/archive/2011/06/09/2076878.html

关闭”xx程序已停止工作”提示窗口相关推荐

  1. 计算机最基础软件怎么应用程序,如何解决Win7系统运行软件就会提示Microsoft基础类应用程序已停止工作-电脑自学网...

    有Win7系统用户反馈说每次打开软件时就会提示Microsoft基础类应用程序已停止工作,并且无法运行软件,这是怎么回事呢?为什么Win7系统运行软件就会提示Microsoft基础类应用程序已停止工作 ...

  2. 解决MS Office Word 2007/2010关闭时出现“已停止工作”问题的方法

    我在win7旗舰版系统上安装了office2010,结果发现每当执行了保存关闭Word时就会出现"Word已经停止工作"的提示框,如图: 若仅仅是新建一个空Word文档而不进行任何 ...

  3. Word 2007关闭时出现“已停止工作”的解决方法

    http://support.microsoft.com/kb/2654846/zh-tw 我用过微软的Office 2003和2007及2010,在Word中,2007和2010都会出现一种现象,就 ...

  4. Win7遇到:应用程序已停止工作,故障模块 ntdll.dll

    问题 APPCRASH 故障模块名称: ntdll.dll 解决方案: 以管理员身份运行cmd,输入sfc/scannow

  5. 双显卡电脑出现,xx.exe 已停止工作,appcrash问题,解决方案

    花了半天时间终于解决! 可切换显卡方式 选择, 手动或者根据电源选择图形处理器  应用.问题就解决了

  6. 英雄联盟一打开就提示版本服务器关闭链接,是否启用修复程序经行修复,英雄联盟停止运行_LOL启动游戏提示~league of legends已停止工作是什......

    LOL停止工作 一.缺少DLL文件以及相关的游戏运行组件,可以使用WeGame或者驱动精灵检测 二.系统不兼容,建议使用兼容模式运行 三.杀毒软件禁止服务项,可以自行查看 四.有最近更新的补丁,建议全 ...

  7. win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!

    win7或win2008系统中,出现[已停止工作,联机检查解决方案并关闭该程序,关闭程序]解决方法! 经过摸索,点击[控制面板]-[操作中心]-[更改操作中心设置]-[问题报告设置]-[从不检查解决方 ...

  8. 解决电脑频繁跳出 已停止工作,出现了一个问题,导致程序停止正常工作,请关闭该程序...

    在使用ScriptPNG.cmd 批量压缩图片的时候,win7系统时不时跳出"pngout.exe已停止工作,出现了一个问题,导致程序停止正常工作,请关闭该程序" 本来说点击几下就 ...

  9. 解决电脑频繁跳出 “已停止工作,出现了一个问题,导致程序停止正常工作,请关闭该程序“

    解决电脑频繁跳出 "已停止工作,出现了一个问题,导致程序停止正常工作,请关闭该程序" 参考文章: (1)解决电脑频繁跳出 "已停止工作,出现了一个问题,导致程序停止正常工 ...

  10. VS2010 打包生成exe文件后 运行安装文件出现 TODO:文件说明已停止工作并已关闭

    一.VS2010 打包生成exe文件后  运行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了 ...

最新文章

  1. JavaScript中的constructor属性
  2. 一句话总结英国新规:不欢迎AI专业的中国留学生、学者与研究员
  3. Java数据结构与算法(第二章数组)
  4. 微软称HTML5是IE 9的核心 要尽快淘汰IE 6
  5. LeetCode Course Schedule II(拓扑排序)
  6. 程序练习:Matlab 实现最小二乘法
  7. pygame外星人2
  8. 工作琐事太多怎么办_东莞夫妻感情不合怎么办 东莞专业离婚咨询
  9. pku 2186 Popular Cows (tarjan缩点)
  10. 和could的区别用法_高考英语语法情态动词用法指南
  11. 华为的薪酬福利与激励体系
  12. Julia Pro国内下载地址
  13. 使用metamask发起交易的时候,交易卡在pending了怎么办?
  14. android developer tiny share-20170603
  15. Beaglebone Black – 智能家居控制系统 LAS - 插座组装
  16. log buffer及日志管理深入分析及性能调整(七)
  17. 《天池龙珠 - Python训练营》03.Python基础进阶:从函数到高级魔法方法
  18. dns 劫持什么意思、dns 劫持原理及几种解决方法
  19. 无法开启 IE 开发者工具
  20. 跨境电商运营如何做好推特广告

热门文章

  1. oracle中查找执行效率低下的SQL
  2. Cisco的路由器、交换机设置 Console 密码和 Enable 密码
  3. 晶振电路电容选取的计算方法
  4. CSS3实现两头细中间粗的线(纵向)与一线两色\渐变线\文字投影\文字渐变等
  5. 印度互联网创业大热:会出现“下一个苹果”?
  6. ubuntu系统给u盘拷贝文件
  7. 【平面几何】点线距离与位置关系
  8. 三维坐标转经纬度_地形图坐标转换小程序使用方法
  9. SpringBoot集成Beetl
  10. 基于yolov3 v4 v5的电梯轿厢下的电动车目标检测