C#检测外部exe程序弹窗错误,并重启
检测外部exe程序弹窗错误,并重启

//可以放到timer里执行
private void button2_Click(object sender, EventArgs e)
{
string mainTitle = System.Configuration.ConfigurationManager.AppSettings["mainTitle"];
//弹框的class名称可以用Spy++程序来获取
string mainClassName = System.Configuration.ConfigurationManager.AppSettings["mainClassName"];
string labelClassName = System.Configuration.ConfigurationManager.AppSettings["labelClassName"];
string buttonTxt = System.Configuration.ConfigurationManager.AppSettings["buttonTxt"];
//MessageBox弹框
var isFind = FindException(mainTitle, mainClassName, labelClassName, buttonTxt);
if (isFind == false)
{
var list = System.Diagnostics.Process.GetProcessesByName("Win.Process");
var sb1 = new StringBuilder(100);
foreach (var item in list)
{
GetClassNameW(item.MainWindowHandle, sb1, sb1.Capacity);
sb1.Append(",");
}
string dynamicName = sb1.ToString().Split('.').Last().Replace(",", "");
mainClassName = "WindowsForms10.Window.8.app.0." + dynamicName;
labelClassName = "WindowsForms10.STATIC.app.0." + dynamicName;
buttonTxt = "退出(&Q)";
//未捕获异常弹窗
FindException(mainTitle, mainClassName, labelClassName, buttonTxt);
}
}
/// <summary>
/// 获取报错弹窗,记录日志,然后重启目标程序
/// </summary>
/// <param name="mainTitle"></param>
/// <param name="mainClassName"></param>
/// <param name="labelClassName"></param>
/// <param name="buttonTxt"></param>
/// <returns></returns>
private bool FindException(string mainTitle, string mainClassName, string labelClassName, string buttonTxt)
{
appWin = FindWindow(mainClassName, mainTitle);
if (appWin != IntPtr.Zero)
{
IntPtr childHwnd = FindWindowEx(appWin, IntPtr.Zero, null, buttonTxt);
if (childHwnd != IntPtr.Zero)
{
var sb = new StringBuilder(500);
var label = FindWindowEx(appWin, IntPtr.Zero, labelClassName, null);
if (label != IntPtr.Zero)
{
GetWindowText(label, sb, sb.Capacity);
var log = $"\n{DateTime.Now}\n获取的异常:{ sb.ToString()}\n";
richTextBox1.AppendText(log);
richTextBox1.ScrollToCaret();
System.IO.File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory +"/"+ DateTime.Now.ToString("yyyyMMdd")+ ".txt", log);
//SendEmail( $"【{mainTitle}】出现异常:{sb.ToString()}");
}
SendMessage(childHwnd, BM_CLICK, 0, 0);
SendMessage(childHwnd, BM_CLICK, 0, 0);
System.Threading.Thread.Sleep(1000);
//重启程序
System.Diagnostics.Process.Start(_targetExePath);
}
return true;
}
return false;
}
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);
//窗口发送给按钮控件的消息,让按钮执行点击操作,可以模拟按钮点击
private const int BM_CLICK = 0xF5;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int nMaxCount);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
//获取窗口类名
[DllImport("user32.dll")]
private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="mainTitle" value="xxx系统"/>
<add key="mainClassName" value="#32770"/>
<add key="labelClassName" value="Static"/>
<add key="buttonTxt" value="确定"/>
<add key="targetExePath" value="D:\xxx.exe"/>
</appSettings>
</configuration>
/*
文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现