alielie
2026-09-10 f3889f2d36c50cf99468594854def9b7ed069fb5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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();
        }
 
    }
}