「C#」Singletonデスクトップアプリケーションのdemo
処理コード:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace SingletonDesktopAppDemo { static class Program { #region Win32 API [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(ref string lpClassName, ref string lpWindowName); private enum WindowShowStyle : uint { /// <summary>Hides the window and activates another window.</summary> /// <remarks>See SW_HIDE</remarks> Hide = 0, /// <summary>Activates and displays a window. If the window is minimized /// or maximized, the system restores it to its original size and /// position. An application should specify this flag when displaying /// the window for the first time.</summary> /// <remarks>See SW_SHOWNORMAL</remarks> ShowNormal = 1, /// <summary>Activates the window and displays it as a minimized window.</summary> /// <remarks>See SW_SHOWMINIMIZED</remarks> ShowMinimized = 2, /// <summary>Activates the window and displays it as a maximized window.</summary> /// <remarks>See SW_SHOWMAXIMIZED</remarks> ShowMaximized = 3, /// <summary>Maximizes the specified window.</summary> /// <remarks>See SW_MAXIMIZE</remarks> Maximize = 3, /// <summary>Displays a window in its most recent size and position. /// This value is similar to "ShowNormal", except the window is not /// actived.</summary> /// <remarks>See SW_SHOWNOACTIVATE</remarks> ShowNormalNoActivate = 4, /// <summary>Activates the window and displays it in its current size /// and position.</summary> /// <remarks>See SW_SHOW</remarks> Show = 5, /// <summary>Minimizes the specified window and activates the next /// top-level window in the Z order.</summary> /// <remarks>See SW_MINIMIZE</remarks> Minimize = 6, /// <summary>Displays the window as a minimized window. This value is /// similar to "ShowMinimized", except the window is not activated.</summary> /// <remarks>See SW_SHOWMINNOACTIVE</remarks> ShowMinNoActivate = 7, /// <summary>Displays the window in its current size and position. This /// value is similar to "Show", except the window is not activated.</summary> /// <remarks>See SW_SHOWNA</remarks> ShowNoActivate = 8, /// <summary>Activates and displays the window. If the window is /// minimized or maximized, the system restores it to its original size /// and position. An application should specify this flag when restoring /// a minimized window.</summary> /// <remarks>See SW_RESTORE</remarks> Restore = 9, /// <summary>Sets the show state based on the SW_ value specified in the /// STARTUPINFO structure passed to the CreateProcess function by the /// program that started the application.</summary> /// <remarks>See SW_SHOWDEFAULT</remarks> ShowDefault = 10, /// <summary>Windows 2000/XP: Minimizes a window, even if the thread /// that owns the window is hung. This flag should only be used when /// minimizing windows from a different thread.</summary> /// <remarks>See SW_FORCEMINIMIZE</remarks> ForceMinimized = 11 } [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32")] private static extern int SetForegroundWindow(IntPtr hwnd); [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow); #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { // Open or create named mutex Mutex pMutex = new Mutex(false, Application.ProductName); // Get ownershiip of mutex if (!pMutex.WaitOne(0, false)) { // Mutex owned by someone else // The window's caption(i.e. Form.Text) should be same with // the window you want to open(e.g. main form's caption). string windowName = "MyApp"; IntPtr hWnd = FindWindow(null, windowName); if (hWnd != IntPtr.Zero) { ShowWindow(hWnd, WindowShowStyle.Restore); SetForegroundWindow(hWnd); // MessageBox.Show("App already running!" ); } else { MessageBox.Show("could not find window"); } } else { Run(); // release mutex when done... pMutex.ReleaseMutex(); return; } } static void Run() { Form myApp = new Form(); myApp.Text = "MyApp"; // Here goes you Application.Run(...) etc. Application.EnableVisualStyles(); Application.Run(myApp); } } }