WPF程序只运行一个实例;
下面的代码还 尝试,如果窗体最小化的时候,让窗体还原
public partial class App : Application { private static Semaphore singleInstanceWatcher; private static bool createdNew; static App() { // Ensure other instances of this application are not running. singleInstanceWatcher = new Semaphore( 0, // Initial count. 1, // Maximum count. Assembly.GetExecutingAssembly().GetName().Name, out createdNew); if (createdNew) { // This thread created the kernel object so no other instance // of this application must be running. //Application currApp = Application.Current; //currApp.StartupUri = new Uri("MainWindow.xaml", UriKind.RelativeOrAbsolute); MainWindow win = new MainWindow(); win.Show(); } else { // This thread opened an existing kernel object with the same // string name; another instance of this app must be running now. // Gets a new System.Diagnostics.Process component and the // associates it with currently active process. Process current = Process.GetCurrentProcess(); // Enumerate through all the process resources on the share // local computer that the specified process name. foreach (Process process in Process.GetProcessesByName(current.ProcessName)) { if (process.Id != current.Id) { NativeMethods.SetForegroundWindow( process.MainWindowHandle); NativeMethods.ShowWindow(process.MainWindowHandle, WindowShowStyle.Restore); break; } } // Terminate this process and gives the underlying operating // system the specified exit code. Environment.Exit(-2); } // 如果代码在Application_Startup中 如下 // private Semaphore singleInstanceWatcher; // private bool createdNew; //private void Application_Startup(object sender, StartupEventArgs e) //{ // singleInstanceWatcher = new Semaphore( // 0, // Initial count. // 1, // Maximum count. // Assembly.GetExecutingAssembly().GetName().Name, // out createdNew); // if (createdNew) // { // // This thread created the kernel object so no other instance // // of this application must be running. // Application currApp = Application.Current; // currApp.StartupUri = new Uri("MainWindow.xaml", UriKind.RelativeOrAbsolute); // } // else // { // //MessageBox.Show("系统已经运行"); // Process current = Process.GetCurrentProcess(); // foreach (Process process in // Process.GetProcessesByName(current.ProcessName)) // { // if (process.Id != current.Id) // { // NativeMethods.SetForegroundWindow( // process.MainWindowHandle); // NativeMethods.ShowWindow(process.MainWindowHandle, // WindowShowStyle.Restore); // break; // } // } // Environment.Exit(-2); // } } } internal 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 .. /// 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 ..</summary> /// <remarks>See SW_SHOWMINIMIZED</remarks> ShowMinimized = 2, /// <summary>Activates the window and displays it ..</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 ..</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 ..</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 .. /// a minimized window.</summary> /// <remarks>See SW_RESTORE</remarks> Restore = 9, /// <summary>Sets the show state based on the SW_ value specified .. /// 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 } static class NativeMethods { /// <summary> /// Brings the thread that created the specified window into the /// foreground and activates the window. Keyboard input is directed /// to the window, and various visual cues are changed for the user. /// The system assigns a slightly higher priority to the thread that /// created the foreground window than it does to other threads. /// </summary> /// <param name="hWnd">A handle to the window that should be /// activated and brought to the foreground. /// </param> /// <returns>If the window was brought to the foreground, the /// return value is nonzero. </returns> [DllImport("user32.dll")] internal static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary>Shows a Window</summary> /// <remarks> /// <para>To perform certain special effects when showing or hiding a /// window, use AnimateWindow.</para> /// <para>The first time an application calls ShowWindow, it should use /// the WinMain function‘s nCmdShow parameter as its nCmdShow .. /// Subsequent calls to ShowWindow must use one of the values in the /// given list, instead of the one specified by the WinMain function‘s /// nCmdShow parameter.</para> /// <para>As noted in the discussion of the nCmdShow parameter, the /// nCmdShow value is ignored in the first call to ShowWindow if the /// program that launched the application specifies startup information /// in the structure. In this case, ShowWindow uses the information /// specified in the STARTUPINFO structure to show the window. On /// subsequent calls, the application must call ShowWindow with .. /// set to SW_SHOWDEFAULT to use the startup information provided by .. /// program that launched the application. This behavior is designed .. /// the following situations: </para> /// <list type=""> /// <item>Applications create their main window by calling .. /// with the WS_VISIBLE flag set. </item> /// <item>Applications create their main window by calling .. /// with the WS_VISIBLE flag cleared, and later call ShowWindow .. /// SW_SHOW flag set to make it visible.</item> /// </list></remarks> /// <param name="hWnd">Handle to the window.</param> /// <param name="nCmdShow">Specifies how the window is to be shown. /// This parameter is ignored the first time an application calls /// ShowWindow, if the program that launched the application provides a /// STARTUPINFO structure. Otherwise, the first time ShowWindow .. , /// the value should be the value obtained by the WinMain function .. /// nCmdShow parameter. In subsequent calls, this parameter .. /// the WindowShowStyle members.</param> /// <returns> /// If the window was previously visible, the return value is nonzero. /// If the window was previously hidden, the return value is zero. /// </returns> [DllImport("user32.dll")] internal static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow); }
时间: 2024-09-29 10:16:04