From 3d6ee55f5a4ab824bf22fca13d7fcfc32a55051a Mon Sep 17 00:00:00 2001 From: clowwindy Date: Sat, 8 Nov 2014 15:27:49 +0800 Subject: [PATCH] close #17 --- shadowsocks-csharp/Program.cs | 73 ++++++++++++++++----------- shadowsocks-csharp/View/ConfigForm.cs | 18 +++++++ 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index f8590df3..516bdf80 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -3,8 +3,11 @@ using Shadowsocks.Properties; using Shadowsocks.View; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; +using System.Reflection; using System.Runtime.InteropServices; +using System.Threading; using System.Windows.Forms; namespace Shadowsocks @@ -20,39 +23,51 @@ namespace Shadowsocks [STAThread] static void Main() { - string tempPath = Path.GetTempPath(); - string dllPath = tempPath + "/polarssl.dll"; - try + using (Mutex mutex = new Mutex(false, "Global\\" + Assembly.GetExecutingAssembly().GetType().GUID.ToString())) { - FileManager.UncompressFile(dllPath, Resources.polarssl_dll); - } - catch (IOException e) - { - Console.WriteLine(e.ToString()); - } - LoadLibrary(dllPath); + if (!mutex.WaitOne(0, false)) + { + Process[] oldProcesses = Process.GetProcessesByName("Shadowsocks"); + if (oldProcesses.Length > 0) + { + Process oldProcess = oldProcesses[0]; + } + MessageBox.Show("Shadowsocks is already running.\n\nFind Shadowsocks icon in your notify tray."); + return; + } + string tempPath = Path.GetTempPath(); + string dllPath = tempPath + "/polarssl.dll"; + try + { + FileManager.UncompressFile(dllPath, Resources.polarssl_dll); + } + catch (IOException e) + { + Console.WriteLine(e.ToString()); + } + LoadLibrary(dllPath); - try - { - FileStream fs = new FileStream("shadowsocks.log", FileMode.Append); - TextWriter tmp = Console.Out; - StreamWriter sw = new StreamWriter(fs); - sw.AutoFlush = true; - Console.SetOut(sw); - Console.SetError(sw); - } - catch (IOException e) - { - Console.WriteLine(e.ToString()); - } - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - ShadowsocksController controller = new ShadowsocksController(); - - // TODO run without a main form to save RAM - Application.Run(new ConfigForm(controller)); + try + { + FileStream fs = new FileStream("shadowsocks.log", FileMode.Append); + TextWriter tmp = Console.Out; + StreamWriter sw = new StreamWriter(fs); + sw.AutoFlush = true; + Console.SetOut(sw); + Console.SetError(sw); + } + catch (IOException e) + { + Console.WriteLine(e.ToString()); + } + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + ShadowsocksController controller = new ShadowsocksController(); + // TODO run without a main form to save RAM + Application.Run(new ConfigForm(controller)); + } } } } diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 53802741..350fe5ae 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -17,6 +17,7 @@ namespace Shadowsocks.View // this is a copy of configuration that we are working on private Configuration modifiedConfiguration; private int oldSelectedIndex = -1; + private bool isFirstRun; public ConfigForm(ShadowsocksController controller) { @@ -162,6 +163,10 @@ namespace Shadowsocks.View this.Hide(); })); } + else + { + isFirstRun = true; + } } private void ServersListBox_SelectedIndexChanged(object sender, EventArgs e) @@ -222,6 +227,17 @@ namespace Shadowsocks.View this.Close(); } + private void showFirstTimeBalloon() + { + if (isFirstRun) + { + notifyIcon1.BalloonTipTitle = "Shadowsocks is here"; + notifyIcon1.BalloonTipText = "You can find turn on/off Shadowsocks in the context menu"; + notifyIcon1.ShowBalloonTip(0); + isFirstRun = false; + } + } + private void OKButton_Click(object sender, EventArgs e) { if (!saveOldSelectedServer()) @@ -235,12 +251,14 @@ namespace Shadowsocks.View } controller.SaveConfig(modifiedConfiguration); this.Hide(); + showFirstTimeBalloon(); } private void CancelButton_Click(object sender, EventArgs e) { this.Hide(); loadCurrentConfiguration(); + showFirstTimeBalloon(); } private void ConfigForm_FormClosed(object sender, FormClosedEventArgs e)