using DataEntity.Share; using HxEnum; using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; using XCommon; using XCommon.Log; using XCommon.MySql; using XImagingXhandler.XDAL; namespace XHandler { /// /// App.xaml 的交互逻辑 /// public partial class App : Application { /// 该函数设置由不同线程产生的窗口的显示状态 /// /// 窗口句柄 /// 指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分 /// 如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零 [DllImport("User32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); /// /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。 /// 系统给创建前台窗口的线程分配的权限稍高于其他线程。 /// /// 将被激活并被调入前台的窗口句柄 /// 如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零 [DllImport("User32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); private const int SW_MAXIMIZE = 3; private static void HandleRunningInstance(Process instance) { ShowWindowAsync(instance.MainWindowHandle, SW_MAXIMIZE);//显示 SetForegroundWindow(instance.MainWindowHandle);//当到最前端 } private static Process RuningInstance() { Process currentProcess = Process.GetCurrentProcess(); Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessName); foreach (Process process in Processes) { if (process.Id != currentProcess.Id) { if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == currentProcess.MainModule.FileName) { return process; } } } return null; } protected override void OnStartup(StartupEventArgs e) { try { LoggerHelper.InitialILog(); LoggerRunHelper.InitialILog(); LoggerSocketHelper.InitialILog(); Process process = RuningInstance(); if (process != null) { LoggerHelper.InfoLog("应用程序已经在运行中。。。"); HandleRunningInstance(process); System.Threading.Thread.Sleep(1000); System.Environment.Exit(1); } if (!MySqlUtity.ConnectTestW(MySqlUtity.GetConnection())) { MessageBox.Show("数据库连接失败,请检查!"); System.Environment.Exit(1); } LoggerHelper.InfoLog("应用程序启动。。。"); // 获取当前软件信息 LoggerHelper.InfoLog("1"); SoftwareInformation softwareInfo = SoftwareInformationDB.GetSoftwareInformationDataFromdb(EnumManagement.GetEnumValue(IsAvailableEnum.Yes)); LoggerHelper.InfoLog("2"); Shared.SoftwareInformation = softwareInfo; LoggerHelper.InfoLog("3"); // 获取当前设备臂信息 if(softwareInfo == null) { return; } List deviceArmList = DeviceArmDB.GetDeviceArmFromdb(softwareInfo.software_information_id); LoggerHelper.InfoLog("4"); Shared.DeviceArmList = deviceArmList; LoggerHelper.InfoLog("5"); // 夹爪机械臂ID var gripper = deviceArmList.FirstOrDefault(it=>it.arm_type == EnumManagement.GetEnumValue(ArmTypeEnum.Gripper)); if (gripper == null) { //MessageBox.Show("夹爪机械臂获取失败,请检查!"); //System.Environment.Exit(1); //可能设备就没有夹爪 } else { Shared.GripperArmId = gripper.device_arm_id; } // 通道配置 var channel = deviceArmList.FirstOrDefault(it => it.arm_type == EnumManagement.GetEnumValue(ArmTypeEnum.Channel)); if (channel == null) { MessageBox.Show("通道获取失败,请检查!"); System.Environment.Exit(1); } if (channel.channels == 96) { Shared.ChannelCount = 96; } else { Shared.ChanelArmId = channel.device_arm_id; string[] strArmProperty = channel.device_arm_property.Trim().Split(','); if (strArmProperty.Length > 0&& strArmProperty[0]!="") { if (channel.channels >= 1 && strArmProperty.Length == 1) { Shared.ChannelsId = Array.ConvertAll(strArmProperty, s => int.Parse(s)); Shared.ChannelCount = channel.channels; } else { Array.ConvertAll(strArmProperty, s => int.Parse(s)); Shared.ChannelsId = Array.ConvertAll(strArmProperty, s => int.Parse(s)); Shared.ChannelCount = Shared.ChannelsId.Length; } } if (Shared.ChannelCount == 0) { MessageBox.Show("已设置通道数量为0,请检查!"); System.Environment.Exit(1); } } #region 获取配置参数 if (!ComUtility.GetConfigParams()) { MessageBox.Show("获取配置参数失败,请检查!"); System.Environment.Exit(1); } #endregion FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false; base.OnStartup(e); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } public App() { Startup += App_Startup; Exit += App_Exit; } private void App_Exit(object sender, ExitEventArgs e) { LoggerHelper.InfoLog("应用程序退出。。。"); LoggerHelper.ShutDownLogger(); LoggerRunHelper.ShutDownLogger(); } private void App_Startup(object sender, StartupEventArgs e) { //UI线程未捕获异常处理事件 DispatcherUnhandledException += App_DispatcherUnhandledException; //Task线程内未捕获异常处理事件 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; //非UI线程未捕获异常处理事件 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } /// /// UI线程未捕获异常处理函数 /// private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { try { LoggerHelper.ErrorLog(e.ToString()); e.Handled = true; string msg = ExceptionToString(e.Exception, "UI线程"); MessageBox.Show(msg, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); string msg = ExceptionToString(ex, "UI线程 处理函数"); MessageBox.Show(msg, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// Task线程内未捕获异常处理函数 /// private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) { try { LoggerHelper.ErrorLog(e.ToString()); string msg = ExceptionToString(e.Exception, "Task线程"); MessageBox.Show(msg, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); e.SetObserved();//设置该异常已察觉(这样处理后就不会引起程序崩溃) } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); string msg = ExceptionToString(ex, "Task线程 处理函数"); MessageBox.Show(msg, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 非UI线程未捕获异常处理函数 /// private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { try { LoggerHelper.ErrorLog(e.ToString()); string msg; if (e.ExceptionObject is Exception ex) { msg = ExceptionToString(ex, "非UI线程"); } else { msg = $"发生了一个错误!信息:{e.ExceptionObject}"; } MessageBox.Show(msg, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); string msg = ExceptionToString(ex, "非UI线程 处理函数"); MessageBox.Show(msg, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 提取异常信息 /// private static string ExceptionToString(Exception ex, string info) { LoggerHelper.ErrorLog("ERROR", ex); StringBuilder str = new StringBuilder($"{DateTime.Now}, {info}发生了一个错误!{Environment.NewLine}"); if (ex.InnerException == null) { str.Append($"[对象名称]:{ex.Source}{Environment.NewLine}"); str.Append($"[异常类型]:{ex.GetType().Name}{Environment.NewLine}"); str.Append($"[详细信息]:{ex.Message}{Environment.NewLine}"); str.Append($"[堆栈调用]:{ex.StackTrace}"); } else { str.Append($"[对象名称]:{ex.InnerException.Source}{Environment.NewLine}"); str.Append($"[异常类型]:{ex.InnerException.GetType().Name}{Environment.NewLine}"); str.Append($"[详细信息]:{ex.InnerException.Message}{Environment.NewLine}"); str.Append($"[堆栈调用]:{ex.InnerException.StackTrace}"); } return str.ToString(); } } }