using Microsoft.Win32; using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Net.NetworkInformation; using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; using Vinno.FIS.Sonopost.Common; using Vinno.FIS.Sonopost.Features.Network; using Vinno.FIS.Sonopost.Features.Oled; using Vinno.FIS.Sonopost.Helpers; using Vinno.FIS.Sonopost.Managers; using Vinno.FIS.Sonopost.Managers.Interfaces; using Vinno.FIS.Sonopost.Settings; using Vinno.IUS.Common.Log; namespace Vinno.FIS.Sonopost { /// /// App.xaml 的交互逻辑 /// public partial class App : Application { private readonly LogEngine _logEngine = new SonopostLogEngine(); private readonly ManualResetEvent _manualResetEvent = new ManualResetEvent(false); private WebHost _webHost; private INetworkManager _networkManager; private IOledManager _oledManager; private bool _isWifi; private bool _isDisposed; protected override void OnStartup(StartupEventArgs e) { try { base.OnStartup(e); CheckedOpenRepeatedly(); var absolutePath = Path.GetPathRoot(AppDomain.CurrentDomain.BaseDirectory); var path = Path.Combine(absolutePath, "Sonopost"); DirectoryHelper.CreateDirectory(path); SonopostConstants.DataFolder = path; Logger.RegisterEngine(_logEngine); Logger.WriteLineWarn("=======================Sonopost BootUp======================="); FISIMPL.FISIMPL.InitLogWriter(); var version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); Logger.WriteLineInfo($"Current Version:{version}"); AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; this.DispatcherUnhandledException += OnDispatcherUnhandledException; SystemEvents.SessionEnded += OnSessionEnded; ProcessHelper.FinishProcessByName(SonopostConstants.UpgradeAppName); AppManager.Instance.Initialize(); Init(); CreateWebHost(); } catch (Exception ex) { Logger.WriteLineError($"Sonopost Start Up Error:{ex}"); SonopostUserDefinedSettings.Instance.Reset(); Process.GetCurrentProcess().Kill(); } } private void CreateWebHost() { if (_webHost == null) { _webHost = new WebHost(); _webHost.Start(); } } private void Init() { AppManager.Instance.GetManager().Init(); AppManager.Instance.GetManager().Init(); AppManager.Instance.GetManager().Init(); SystemHelper.Init(); _networkManager = AppManager.Instance.GetManager(); _networkManager.CurrentNetworkChanged += OnCurrentNetworkChanged; _networkManager.CurrentWifiLevelChanged += OnCurrentWifiLevelChanged; _oledManager = AppManager.Instance.GetManager(); _oledManager.ShowStatus(OledMessage.Started); SetNetwork(); OnCurrentNetworkChanged(null, _networkManager.CurrentNetwork); OnCurrentWifiLevelChanged(null, _networkManager.CurrentWifiLevel); // CheckAvailableDevices(); AutoLogin(); if (SonopostUserDefinedSettings.Instance.CaptureSetting.RealTimeCaptureEnabled) { AppManager.Instance.GetManager().StartKeyBoardListen(); } } private void OnCurrentNetworkChanged(object sender, NetworkInterfaceInfo e) { if (e != null) { var ip = e.IpAddress.Value; var mac = e.MacAddress; Logger.WriteLineInfo($"Current IP:{ip}"); Logger.WriteLineInfo($"Current Mac:{mac}"); if (!string.IsNullOrEmpty(ip) && e.OperationalStatus == OperationStatus.Connected) { _oledManager.ShowMessages(1, MessageType.DisplayEnglishMediumWithPageNum, ip, 1); } else { _oledManager.ShowMessages(1, MessageType.DisplayEnglishMediumWithPageNum, mac, 1); } _isWifi = e.NetworkInterfaceType == NetworkInterfaceType.Wireless80211; if (!_isWifi) { _oledManager.ClearImage(1, 104, 4, 24, 24); } } } private void OnCurrentWifiLevelChanged(object sender, int e) { if (_isWifi) { var levelPic = $"wifi_{e}.png"; _oledManager.ShowImage(1, MessageType.DisplayImageInCurrentPage, 104, 4, levelPic); } } private void SetNetwork() { try { if (SonopostUserDefinedSettings.Instance.NetworkSetting.NeedDoubleNetwork) { var outsideAddress = SonopostUserDefinedSettings.Instance.NetworkSetting.OutsideNetworkMacAddress; var outsideInterface = _networkManager.GetAllNetworkInterfaceInfos().FirstOrDefault(c => c.MacAddress == outsideAddress); if (outsideInterface == null) return; var result = _networkManager.SetDualNetwork(outsideInterface.MacAddress); Logger.WriteLineInfo(result ? "SetDualNetworkEnable Success!" : "SetDualNetworkEnable Fail!"); } } catch (Exception e) { Logger.WriteLineError($"SetNetwork Error:{e}"); } } private void AutoLogin() { Logger.WriteLineInfo($"Auto Login:{SonopostUserDefinedSettings.Instance.ServerSetting.IsAutoLogin}"); if (SonopostUserDefinedSettings.Instance.ServerSetting.IsAutoLogin) { AppManager.Instance.GetManager().Login(); } } private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { Logger.WriteLineError($"DispatcherUnhandledException:{e.Exception}"); _oledManager?.ShowStatus(OledMessage.Error); Thread.Sleep(2000); Process.GetCurrentProcess().Kill(); } private void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) { Logger.WriteLineError($"UnhandledException:{e.ExceptionObject}"); _oledManager?.ShowStatus(OledMessage.Error); Thread.Sleep(2000); Process.GetCurrentProcess().Kill(); } /// /// 判断是否重复打开 /// private void CheckedOpenRepeatedly() { var thisProcess = Process.GetCurrentProcess(); if (Process.GetProcessesByName(thisProcess.ProcessName).Where(x => x.ProcessName == thisProcess.ProcessName).Count() > 1) { thisProcess.Kill(); } } private void OnSessionEnded(object sender, SessionEndedEventArgs e) { try { Logger.WriteLineWarn($"Sonopost OnSessionEnded Invoke"); Dispose(); } catch (Exception ex) { Logger.WriteLineError($"Sonopost OnSessionEnded Invoke Error:{ex}"); } finally { Process.GetCurrentProcess().Kill(); } } protected override void OnExit(ExitEventArgs e) { try { Logger.WriteLineWarn("Sonopost OnExit Invoke"); Dispose(); base.OnExit(e); } catch (Exception ex) { Logger.WriteLineError($"Sonopost OnExit Invoke Error:{ex}"); } finally { Process.GetCurrentProcess().Kill(); } } private void Dispose() { if (_isDisposed) { _manualResetEvent.WaitOne(3000); return; } Logger.WriteLineWarn("Sonopost Dispose Invoke"); try { _isDisposed = true; Task.Run(() => { try { _oledManager?.ShowStatus(OledMessage.ShutDown); Thread.Sleep(50); _networkManager.CurrentNetworkChanged -= OnCurrentNetworkChanged; _networkManager.CurrentWifiLevelChanged -= OnCurrentWifiLevelChanged; AppDomain.CurrentDomain.UnhandledException -= CurrentDomainUnhandledException; SystemEvents.SessionEnded -= OnSessionEnded; DisposeWebHost(); AppManager.Instance.DisposeAllManagers(); Logger.WriteLineWarn("=======================Sonopost Shutdown======================="); _manualResetEvent.Set(); } catch (Exception ex) { Logger.WriteLineError($"Sonopost Dispose Error:{ex}"); } }); _manualResetEvent.WaitOne(3000); } catch (Exception ex) { Logger.WriteLineError($"Sonopost Dispose Error:{ex}"); } } private void DisposeWebHost() { if (_webHost != null) { _webHost.Dispose(); _webHost = null; } } } }