将WinForm应用程序限制为具有多个实例的一个进程

blu*_*blu 5 c# com wcf winapi winforms

我们在C#3.5(SP 1)中有一个WinForms应用程序.我们希望将应用程序限制在具有多个窗口实例的内存中的一个进程.我们不是在寻找MDI方法,而是在不启动多个应用程序进程的情况下拥有单独的主表单实例.

我们正在评估三种方法:

  1. Windows消息
  2. COM
  3. WCF

我们有前两个(PInvoke with Windows Messages and overrr WinProc,COM Registry等)的粗略细节,他们使用的是旧技术.

我们讨论了将WCF与命名管道一起使用的想法,并认为这可能是完成手头任务的最简洁和最简单的方法.

将应用程序限制为具有多个主要表单实例的一个进程的最简洁,最现代的方法是什么?

Mik*_*e J 3

我过去采用的方法之一是使用系统互斥对象。其背后的理论是,应用程序的第一个实例将生成互斥对象,应用程序的后续实例然后尝试打开预定义互斥对象的句柄,如果存在,则 bamo!退出第二个、第三个和第四个....实例。

public static void CheckSingleInstance()
{
    bool created = false;
    _singleInstance = new Mutex(true, "PredefinedMutexName##1", out created);

    if (!created)
    {
        MessageBox.Show("Another instance of this application is already running. Click OK to switch to that instance.", "Application running", MessageBoxButtons.OK, MessageBoxIcon.Information);

        Process proc = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(proc.ProcessName);
        bool exit = false;
        Process process = null;
        foreach (Process p in procs)
        {
            if (p.Id != proc.Id && p.MainModule.FileName == proc.MainModule.FileName)
            {
                // ShowWindow(p.MainWindowHandle, 1/*SW_SHOWNORMAL*/);
                process = p;
                exit = true;
            }
        }
        if (exit)
        {
            Application.Exit();

            if (process != null)
                NativeMethods.SetForegroundWindow(process.MainWindowHandle);

            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)