| @@ -32,8 +32,12 @@ namespace Shadowsocks | |||||
| } | } | ||||
| Utils.ReleaseMemory(true); | Utils.ReleaseMemory(true); | ||||
| using (Mutex mutex = new Mutex(false, "Global\\Shadowsocks_" + Application.StartupPath.GetHashCode())) | |||||
| using (Mutex mutex = new Mutex(false, $"Global\\Shadowsocks_{Application.StartupPath.GetHashCode()}")) | |||||
| { | { | ||||
| Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); | |||||
| // handle UI exceptions | |||||
| Application.ThreadException += Application_ThreadException; | |||||
| // handle non-UI exceptions | |||||
| AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; | AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; | ||||
| Application.ApplicationExit += Application_ApplicationExit; | Application.ApplicationExit += Application_ApplicationExit; | ||||
| SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; | SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; | ||||
| @@ -48,8 +52,9 @@ namespace Shadowsocks | |||||
| { | { | ||||
| Process oldProcess = oldProcesses[0]; | Process oldProcess = oldProcesses[0]; | ||||
| } | } | ||||
| MessageBox.Show(I18N.GetString("Find Shadowsocks icon in your notify tray.") + "\n" + | |||||
| I18N.GetString("If you want to start multiple Shadowsocks, make a copy in another directory."), | |||||
| MessageBox.Show(I18N.GetString("Find Shadowsocks icon in your notify tray.") | |||||
| + Environment.NewLine | |||||
| + I18N.GetString("If you want to start multiple Shadowsocks, make a copy in another directory."), | |||||
| I18N.GetString("Shadowsocks is already running.")); | I18N.GetString("Shadowsocks is already running.")); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -78,14 +83,23 @@ namespace Shadowsocks | |||||
| if (Interlocked.Increment(ref exited) == 1) | if (Interlocked.Increment(ref exited) == 1) | ||||
| { | { | ||||
| Logging.Error(e.ExceptionObject?.ToString()); | Logging.Error(e.ExceptionObject?.ToString()); | ||||
| MessageBox.Show(I18N.GetString("Unexpected error, shadowsocks will exit. Please report to") + | |||||
| " https://github.com/shadowsocks/shadowsocks-windows/issues " + | |||||
| Environment.NewLine + (e.ExceptionObject?.ToString()), | |||||
| MessageBox.Show( | |||||
| $"{I18N.GetString("Unexpected error, shadowsocks will exit. Please report to")} https://github.com/shadowsocks/shadowsocks-windows/issues {Environment.NewLine}{(e.ExceptionObject?.ToString())}", | |||||
| "Shadowsocks Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | "Shadowsocks Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | ||||
| Application.Exit(); | Application.Exit(); | ||||
| } | } | ||||
| } | } | ||||
| private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) | |||||
| { | |||||
| string errorMsg = $"Exception Type: {e.GetType().Name}{Environment.NewLine}Stack Trace:{Environment.NewLine}{e.Exception.StackTrace}"; | |||||
| Logging.Error(errorMsg); | |||||
| MessageBox.Show( | |||||
| $"{I18N.GetString("Unexpected error, shadowsocks will exit. Please report to")} https://github.com/shadowsocks/shadowsocks-windows/issues {Environment.NewLine}{errorMsg}", | |||||
| "Shadowsocks Error", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||||
| Application.Exit(); | |||||
| } | |||||
| private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) | private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) | ||||
| { | { | ||||
| switch (e.Mode) | switch (e.Mode) | ||||