diff --git a/win32/FireflyConfig/FireflyConfig.cs b/win32/FireflyConfig/FireflyConfig.cs index 67f5dca8..d615d889 100644 --- a/win32/FireflyConfig/FireflyConfig.cs +++ b/win32/FireflyConfig/FireflyConfig.cs @@ -6,6 +6,7 @@ using System.Threading; using System.ComponentModel; using System.Windows.Forms; using System.Data; +using System.Diagnostics; using System.ServiceProcess; using System.Runtime.InteropServices; using System.Text; @@ -31,7 +32,17 @@ namespace FireflyConfig public class FireflyConfig : System.Windows.Forms.Form { + [DllImport("Kernel32.dll", CharSet=CharSet.Auto)] + private static extern IntPtr OpenEvent(UInt32 + dwDesiredAccess, Boolean bInheritHandle, String lpName); + [DllImport("Kernel32.dll", CharSet=CharSet.Auto)] + private static extern IntPtr CreateEvent(UInt32 dwDesiredAccess, + Boolean bManualReset, Boolean bInitialState, String lpName); + [DllImport("user32.dll", EntryPoint="PostMessageA")] + static extern int PostMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); + private System.Threading.Thread UDPThread; + private System.Threading.Thread EventThread; private System.Drawing.Icon icnRunning; private System.Drawing.Icon icnStopped; @@ -77,6 +88,14 @@ namespace FireflyConfig private System.Windows.Forms.Label versionLabel; private System.ComponentModel.IContainer components; + public void ShowConfigWindow() + { + LoadIni(); + Show(); + WindowState = FormWindowState.Normal; + ShowInTaskbar = true; + } + protected override void WndProc(ref Message msg) { if(msg.Msg == 0x11) // WM_QUERYENDSESSION @@ -89,8 +108,8 @@ namespace FireflyConfig Close(); } else if(msg.Msg == 0x0401) // WM_USER + 1 (show config page) - { - Show(); + { + ShowConfigWindow(); } base.WndProc(ref msg); } @@ -184,6 +203,40 @@ namespace FireflyConfig UDPThread.IsBackground=true; UDPThread.Start(); + EventThread = new Thread(new ThreadStart(EventThreadFunction)); + EventThread.IsBackground = true; + EventThread.Start(); + } + + /* Wait for an event */ + public void EventThreadFunction() + { + IntPtr hEvent = IntPtr.Zero; + + hEvent = CreateEvent(0,false,false,"FFCONFIG"); + if(IntPtr.Zero == hEvent) + { + return; + } + AutoResetEvent arEvent = new AutoResetEvent(false); + arEvent.Handle = hEvent; + + WaitHandle[] waitHandles; + waitHandles = new WaitHandle[1]; + waitHandles[0] = arEvent; + + while(arEvent.WaitOne()) + { + try + { + PostMessage( this.Handle, 0x0401, 0, 0); + arEvent.Reset(); + } + catch(ThreadAbortException) + { + return; + } + } } public void UDPThreadFunction() @@ -593,7 +646,28 @@ namespace FireflyConfig [STAThread] static void Main() { - Application.Run(new FireflyConfig()); + Process aProcess = Process.GetCurrentProcess(); + string aProcName = aProcess.ProcessName; + + Process[] processList; + IntPtr hEvent; + processList = Process.GetProcessesByName(aProcName); + + if (processList.Length > 1) + { + hEvent = OpenEvent(2031619,false,"FFCONFIG"); + if(IntPtr.Zero != hEvent) + { + AutoResetEvent arEvent = new AutoResetEvent(false); + arEvent.Handle = hEvent; + arEvent.Set(); + } + Application.Exit(); + } + else + { + Application.Run(new FireflyConfig()); + } } private void notifyIcon_DoubleClick(object sender, System.EventArgs e) diff --git a/win32/FireflyConfig/FireflyConfig.resx b/win32/FireflyConfig/FireflyConfig.resx index ea2cb40e..2773f83d 100644 --- a/win32/FireflyConfig/FireflyConfig.resx +++ b/win32/FireflyConfig/FireflyConfig.resx @@ -160,15 +160,15 @@ Private + + Private + Private False - - Private - Private @@ -385,18 +385,18 @@ 8, 8 - - FireflyConfig - True - 80 + 52 True + + FireflyConfig + Private