首页 > 编程语言 >C#检测外部exe程序弹窗错误,并重启

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

时间:2023-06-30 16:37:07浏览次数:41  
标签:文字 IntPtr 投放 string C# System int 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>
复制代码

 

/*

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

*/

标签:文字,IntPtr,投放,string,C#,System,int,exe,弹窗
From: https://www.cnblogs.com/yidanda888/p/17517160.html

相关文章

  • HTML以及CSS介绍
    HTML介绍HTML(超文本标记语言)是用于创建网页和应用程序的标准标记语言。它提供了网页内容的结构和格式,定义了元素的显示和组织方式。HTML文档由一系列用尖括号(<>)括起来的标签组成。标签用于定义文档中的不同元素及其属性。以下是一个基本的HTML结构示例:<!DOCTYPEhtml><html><h......
  • Kibana Discover查询语言KQL介绍
    使用ELK查询日志已有一段时间,直到今天我才发现KibanaDiscover实际上是默认通过KibanaQueryLanguage(KQL)查询语法来进行数据查询的。常用查询语法全文搜索查找包含101021,或者包含1970325445000048,或者两者都包含。长句子通常会被自动分词。KQL使用一种称为“Tokenizati......
  • linux计划任务crontab的使用
    编辑计划任务:   crontab-e查看计划任务:   crontab-l 使用实例:实例1:每1分钟执行一次command命令:*****command实例2:每小时的第3和第15分钟执行命令:3,15****command实例3:在上午8点到11点的第3和第15分钟执行命令:3,158-11***command实例4:每隔两天的......
  • 自学C语言2023_6_30
    函数:函数——创建一个函数,需要时直接调用,不用多次输入重复的代码   数组:数组——一组相同类型的元素的集合  数组是用下标来访问的intarr[10]={1,2,3,4,5,6,7,8,9,10};中1,2,3,4,5,6,7,8,9,10的下标分别为0,1,2,3,4,5,6,7,8,9(下标从0开始) ......
  • 使用easy-captcha验证码出现javax. script ScriptEngine.eval(String)" because "engi
    1.问题java项目使用  ArithmeticCaptcha  验证码,出现javax.scriptScriptEngine.eval(String)"because"engine"isnulArithmeticCaptchacaptcha=newArithmeticCaptcha(111,36);<dependency><groupId>com.github.whvcse</groupId>......
  • 一种基于DeltaE(CIE 1976)的找色算法
    //QuickFinder.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#define_USE_MATH_DEFINES#include<cmath>#include<ctime>unsignedcharbuf[1080][1920][3];constfloatparam_13=1.0f/3.0f;constfloatparam_1......
  • Mac音乐制作软件-Logic Pro
    LogicPro是苹果公司开发的专业音乐制作软件,为音乐制作人、作曲家和音频工程师提供全面而强大的工具和功能。→→↓↓载LogicPro 多轨录音和编辑:LogicPro支持无限多轨录音和编辑,可以同时处理多个音频和MIDI轨道。用户可以轻松地录制、编辑和排列各种乐器和声音。内置......
  • LCD12864单色屏任意位置显示文字图片功能,不在受限于8bit的分行
    /*取模软件image2Lcdv2.9液晶取模方式:扫描方式:数据水平,字节垂直输出灰度:单色最大宽度和高度:128*64字节内像素数据反序*/#defineLCD_REVERSE_FLAG0#defineLCD_DISPLAY_NORMAL0#defineLCD_DISPLAY_REVERSE1#defineLCD_BUFF_BYTE_MAX1024#defineSCREEN_WIDT......
  • CubeMX TIM 配置AutoReloadPreload
    CubeMX 配置定时器的时候,出现如下选项: 成员变量AutoReloadPreload的取值范围TIM_AUTORELOAD_PRELOAD_DISABLE预装载功能关闭TIM_AUTORELOAD_PRELOAD_ENABLE预装载功能开启用于设置自动重载寄存器TIMx_ARR的预装载功能,即自动重装寄存器的内容是更新事件产生时写入有......
  • EasyExcel validator校验 及自定义 枚举校验
    需要校验的实体importcom.alibaba.excel.annotation.ExcelIgnore;importcom.alibaba.excel.annotation.ExcelProperty;importcom.alibaba.excel.annotation.write.style.ColumnWidth;importcom.ruoyi.system.domain.enums.RoleStatusEnum;importcom.ruoyi.system.domain......