using AddInPlugin.Setting;
|
using Microsoft.Win32;
|
using SeqEditor.Util;
|
using System.Diagnostics;
|
using System.IO;
|
using System.Management;
|
using System.Reflection;
|
using System.Windows;
|
|
namespace OpenTapEditor;
|
|
public class GlobalConfig
|
{
|
public double GlobalFontSize { get; set; } = 14;
|
}
|
public class GlobalConfigHolder
|
{
|
public static GlobalConfig Config { get; internal set; }
|
}
|
|
/// <summary>
|
/// Interaction logic for App.xaml
|
/// </summary>
|
public partial class App : Application
|
{
|
public App()
|
{
|
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; ;
|
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
}
|
|
private void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
|
{
|
//var ex = e.Exception;
|
//MessageBox.Show(ex?.Message, "未知错误");
|
}
|
|
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
{
|
var ex = e.ExceptionObject as Exception;
|
// Log.Error($"UnhandledException. {ex}");
|
MessageBox.Show(ex?.Message, "未知错误");
|
}
|
|
private void WriteRegister()
|
{
|
string Company = "JingCe", Program = "SeqEditor";
|
try
|
{
|
string registryPath = @$"SOFTWARE\{Company}\{Program}";
|
|
using RegistryKey key = Registry.CurrentUser.CreateSubKey(registryPath, true)
|
?? throw new Exception("无法创建或打开注册表键");
|
string path = AppDomain.CurrentDomain.BaseDirectory;
|
key.SetValue("Location", path, RegistryValueKind.String);
|
}
|
catch (Exception ex)
|
{
|
//log.Error("Write Register Failed.", ex);
|
}
|
}
|
|
public static Process GetProcess()
|
{
|
Process cur = Process.GetCurrentProcess();
|
string exePath = Assembly.GetExecutingAssembly().Location;
|
string query = $"SELECT ProcessId FROM Win32_Process WHERE ExecutablePath = '{exePath.Replace("\\", "\\\\")}'";
|
using (var searcher = new ManagementObjectSearcher(query))
|
{
|
foreach (var obj in searcher.Get())
|
{
|
int processId = Convert.ToInt32(obj["ProcessId"]);
|
if (processId != cur.Id)
|
{
|
return Process.GetProcessById(processId);
|
}
|
}
|
}
|
return null;
|
}
|
|
private void LoadConfig()
|
{
|
this.Resources["GlobalFontSize"] = StationSettings.Current.FontSize;
|
}
|
|
protected override void OnStartup(StartupEventArgs e)
|
{
|
base.OnStartup(e); // 放在最后,确保后续逻辑用到时已在内存
|
}
|
|
private static void PreloadAllAssemblies()
|
{
|
var dirs = new System.Collections.Generic.List<string>
|
{
|
AppDomain.CurrentDomain.BaseDirectory
|
};
|
|
string privatePath = "3rds;Libs";
|
if (!string.IsNullOrEmpty(privatePath))
|
{
|
foreach (var p in privatePath.Split(';'))
|
{
|
string full = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, p.Trim());
|
if (Directory.Exists(full)) dirs.Add(full);
|
}
|
}
|
|
foreach (var dir in dirs)
|
{
|
foreach (string dll in Directory.GetFiles(dir, "*.dll"))
|
{
|
try
|
{
|
var ass = Assembly.LoadFrom(dll); // 按名称加载,自动去重
|
}
|
catch (BadImageFormatException)
|
{
|
/* 本机/C++ DLL,跳过 */
|
}
|
catch (FileLoadException)
|
{
|
/* 已加载/强命名不匹配,跳过 */
|
}
|
catch (FileNotFoundException)
|
{
|
/* 依赖缺失,跳过 */
|
}
|
catch
|
{
|
/* 其余异常跳过 */
|
}
|
}
|
}
|
}
|
|
|
private Mutex mutex;
|
public void Application_Startup(object sender, StartupEventArgs e)
|
{
|
var process = GetProcess();
|
|
mutex = new Mutex(true, "OpenTapEditor_OnlyRun_CRNS");
|
if (mutex.WaitOne(0, false))//&& process == null
|
{
|
WriteRegister();
|
LoadConfig();
|
LangUtil.Load();
|
|
//LoadingWindow window = new LoadingWindow();
|
MainWindow window = new MainWindow();
|
window.Show();
|
}
|
else
|
{
|
MessageBox.Show("程序已经在运行!", "提示");
|
this.Shutdown();
|
}
|
|
}
|
}
|