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>

/*

文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放 文字少不能投放

*/

C#检测外部exe程序弹窗错误,并重启的更多相关文章

  1. windows下调用外部exe程序 SHELLEXECUTEINFO

    本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...

  2. C#和asp.net执行外部EXE程序

    这两天研究下.Net的执行外部EXE程序问题,就是在一个程序里通过按钮或其他操作运行起来另外一个程序,需要传入参数,如用户名.密码之类(实际上很类似单点登录,不过要简单的多的多):总结如下: 1.CS ...

  3. c# 调用外部exe程序

    c#调用外部exe程序,首先要 using System.Diagnostics; 然后开启一个新process System.Diagnostics.ProcessStartInfo p=null; ...

  4. C# 将外部exe程序 嵌入到自己的窗体界面

    将别人开发的exe程序,放到自己的窗体里面来运行. 1.基本功能实现 首先,在自己的窗体后面加上代码: [DllImport("User32.dll", EntryPoint = ...

  5. WPF 程序中启动和关闭外部.exe程序

    当需要在WPF程序启动时,启动另一外部程序(.exe程序)时,可以按照下面的例子来: C#后台代码如下: using System; using System.Collections.Generic; ...

  6. [转]VC中调用外部exe程序方式

    本文转自:http://blog.sina.com.cn/s/blog_486285690100ljwu.html 目前知道三种方式:WinExec,ShellExecute ,CreateProce ...

  7. 启动外部exe程序

    Process myProcess = new Process();myProcess.StartInfo.FileName = pathName;myProcess.Start();其中的pathN ...

  8. photoshop cs6安装过程中安装程序遇到错误:请重启计算机,解决办法

    1.关闭防火墙和杀毒软件 2.删除注册表 依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager目录,找到其中的 ...

  9. sqlserver数据库触发器调用外部exe

    sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...

随机推荐

  1. CF1070K Video Posts 题解

    Content 有 \(n\) 个数 \(a_1,a_2,a_3,...,a_n\),要求分成 \(k\) 段,每一段的数的总和相等.输出这些段的长度,或者不可能满足要求. 数据范围:\(1\leqs ...

  2. Nginx加载新的模块,编译报错记录

    参考:https://www.cnblogs.com/Leechg/p/9969000.html ---------如下我的操作记录--------------- nginx -V查看当前nginx信 ...

  3. Tornado WEB服务器框架 Epoll-- 【Mysql数据库】

    5.1 数据库 与Django框架相比,Tornado没有自带ORM,对于数据库需要自己去适配.我们使用MySQL数据库. 在Tornado3.0版本以前提供tornado.database模块用来操 ...

  4. 开发webpart时建立图像文件夹和CSS,js文件夹

    如图所示:是通过添加映射来完成,做好之后,把图像拷到文件夹时,当ascx文件里需要用到图像时,直接把图像拖到ascx文件里的位置.这样就知道该图像的路径 了.

  5. winpcap 静默安装

    前几天做一个小工具用到winpcap,由于有些用户系统未必安装过这个而领导要求尽量减少用户点击,于是只好想办法静默安装了,csdn搜了,貌似没有好用的,求助stackoverflow,还好,在某篇解答 ...

  6. cmake引入第三方库的debug和release版本之Windows版本

    概述 本文将介绍cmak引入第三方库debug和release不同配置. Windows上,习惯将debug模式下生成的动态库名后缀添加D 以作和release区分.cmake创建一个项目A,A引入动 ...

  7. 【LeetCode】294. Flip Game II 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 记忆化搜索 日期 题目地址:https://leetc ...

  8. 【LeetCode】1. Two Sum 两数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:two sum, 两数之和,题解,leetcode, 力 ...

  9. 【剑指Offer】孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python)

    [剑指Offer]孩子们的游戏(圆圈中最后剩下的数) 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-in ...

  10. Centos/Docker/Nginx/Node/Jenkins 操作

    Centos Centos 是一个基于 Linux 的开源免费操作系统 # 本地拷贝文件到远程服务器scp output.txt root@47.93.242.155:/data/ output.tx ...