What is the correct way to create a single-instance WPF application?

前端 未结 30 3254
耶瑟儿~
耶瑟儿~ 2020-11-21 05:14

Using C# and WPF under .NET (rather than Windows Forms or console), what is the correct way to create an application that can only be run as a single instance?

I kno

30条回答
  •  故里飘歌
    2020-11-21 05:52

    Here's a lightweight solution I use which allows the application to bring an already existing window to the foreground without resorting to custom windows messages or blindly searching process names.

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    
    static readonly string guid = "";
    
    static void Main()
    {
        Mutex mutex = null;
        if (!CreateMutex(out mutex))
            return;
    
        // Application startup code.
    
        Environment.SetEnvironmentVariable(guid, null, EnvironmentVariableTarget.User);
    }
    
    static bool CreateMutex(out Mutex mutex)
    {
        bool createdNew = false;
        mutex = new Mutex(false, guid, out createdNew);
    
        if (createdNew)
        {
            Process process = Process.GetCurrentProcess();
            string value = process.Id.ToString();
    
            Environment.SetEnvironmentVariable(guid, value, EnvironmentVariableTarget.User);
        }
        else
        {
            string value = Environment.GetEnvironmentVariable(guid, EnvironmentVariableTarget.User);
            Process process = null;
            int processId = -1;
    
            if (int.TryParse(value, out processId))
                process = Process.GetProcessById(processId);
    
            if (process == null || !SetForegroundWindow(process.MainWindowHandle))
                MessageBox.Show("Unable to start application. An instance of this application is already running.");
        }
    
        return createdNew;
    }
    

    Edit: You can also store and initialize mutex and createdNew statically, but you'll need to explicitly dispose/release the mutex once you're done with it. Personally, I prefer keeping the mutex local as it will be automatically disposed of even if the application closes without ever reaching the end of Main.

提交回复
热议问题