C# "资源管理器已停止工作"的编程解决方案
2016-01-05 17:54
357 查看
如果你使用的是win7+的系统,那么你很可能遇到过下面的提示框:
导致资源管理器崩溃的原因有很多:
1. 第三方软件冲突,包括中毒软件不兼容等情况
2. 系统本身缺陷,包括缺少必要文件,设置错误或注册表异常等情况
3. 其他
百度有很多的解决方案,不过还是要具体情况具体分析,查找根源。这里就不详述了。
如果你在测试你自己的程序的时候遇到这种情况,并且是确定性的,那很可能就是程序本身存在问题,需要调试排查,比如使用日志记录等来跟踪崩溃点。
如果你的程序是要长时间运行的,并且偶尔才会遇到这种情况,排查也没有找到可疑的问题,那么或许一个临时的方案就是,如何让你的程序自动从 资源管理器已停止工作中恢复,这也是今天这里将要提到的解决方案。
我们的思路很简单:当出现崩溃的时候我们桌面上肯定是有这样一个窗口存在,并且其窗口标题是固定的“Windows 资源管理器”,这时,用户界面是停止了交互功能,但如果我们的程序还能够枚举窗口来找到这个窗口,就是我们的程序可以检测到这个情况,那就可以去显式的重启explorer.exe进程,来从这种情况中恢复回来。测试后你会看到,答案是肯定的。不过如果你在程序中结束掉explorer.exe这个进程,一般并不需要你再显式的去重启这个进程,它会自动重启。
那么代码就简单了:
导致资源管理器崩溃的原因有很多:
1. 第三方软件冲突,包括中毒软件不兼容等情况
2. 系统本身缺陷,包括缺少必要文件,设置错误或注册表异常等情况
3. 其他
百度有很多的解决方案,不过还是要具体情况具体分析,查找根源。这里就不详述了。
如果你在测试你自己的程序的时候遇到这种情况,并且是确定性的,那很可能就是程序本身存在问题,需要调试排查,比如使用日志记录等来跟踪崩溃点。
如果你的程序是要长时间运行的,并且偶尔才会遇到这种情况,排查也没有找到可疑的问题,那么或许一个临时的方案就是,如何让你的程序自动从 资源管理器已停止工作中恢复,这也是今天这里将要提到的解决方案。
我们的思路很简单:当出现崩溃的时候我们桌面上肯定是有这样一个窗口存在,并且其窗口标题是固定的“Windows 资源管理器”,这时,用户界面是停止了交互功能,但如果我们的程序还能够枚举窗口来找到这个窗口,就是我们的程序可以检测到这个情况,那就可以去显式的重启explorer.exe进程,来从这种情况中恢复回来。测试后你会看到,答案是肯定的。不过如果你在程序中结束掉explorer.exe这个进程,一般并不需要你再显式的去重启这个进程,它会自动重启。
那么代码就简单了:
var handle = Utility.FindWindow("windows 资源管理器"); if(handle != IntPtr.Zero) { RestartExplorer(); Utility.CloseWindow(handle); } public static void RestartExplorer() { Process[] processes; processes = Process.GetProcessesByName("explorer"); foreach (var p in processes) { p.Kill(); } //wait auto start System.Threading.Thread.Sleep(2000); //ensure start processes = Process.GetProcessesByName("explorer"); if (processes.Count() == 0) { Process.Start("explorer.exe"); } }
相关文章推荐
- C#集成ActiveX控件
- C#wmp.dll自动注册失败
- C# WinForm API 改进单实例运行
- 【C#——揭开你的面纱】
- C# 原样复制excel工作表
- C# 原样复制excel工作表
- c# 将秒数转换成时,分,秒的方法
- C#添加本地打印机
- C# Winform下载文件并显示进度条
- C# 序列化
- C# 序列化
- C#之宏观了解
- C#中Stream和Byte[]互相转换
- C#多线程编程
- C#向并口设备发送指令以获取并口设备的状态
- datatable绑定comboBox显示数据[C#]
- c#截取字符串
- 根据先序、中序、后序中的两者还原二叉树——递归函数和Csharp泛型
- C#中Math.Round()实现中国式四舍五入
- C#static与readonly与const的使用环境