Single instance windows forms application and how to get reference on it?

前端 未结 4 414
轮回少年
轮回少年 2021-01-06 02:09

I have a Windows Forms application that allows only one instance to be running at the time. I have implemented Singleton by using Mutex. The Application must be startable fr

相关标签:
4条回答
  • 2021-01-06 02:32

    I think the easiest way is the following

    see the link

    http://codenicely.blogspot.com/2010/04/creating-forms-object.html

    0 讨论(0)
  • 2021-01-06 02:37

    The .NET framework offers a very good generic solution for this. Check the bottom of this MSDN magazine article. Use the StartupNextInstanceHandler() event handler to pass arbitrary commands to the running instance, like "quit".

    0 讨论(0)
  • 2021-01-06 02:50

    This is a somewhat quick-and-dirty solution which you would probably want to refine:

    [STAThread]
    static void Main()
    {
        var me = Process.GetCurrentProcess();
        var otherMe = Process.GetProcessesByName(me.ProcessName).Where(p => p.Id != me.Id).FirstOrDefault();
    
        if (otherMe != null)
        {
            otherMe.Kill();
        }
        else
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
    

    If an instance of the app is already started, that process is killed; otherwise the app starts normally.

    0 讨论(0)
  • 2021-01-06 02:51

    Is this not over complicating things ? Rather than closing the existing instance and starting a new one, can you not just re-activate the existing instance? Either way round the code below should give you some ideas on how to go about it...?

    Process thisProcess = Process.GetCurrentProcess();
            Process[] allProcesses = Process.GetProcessesByName(thisProcess.ProcessName);
            Process otherProcess = null;
            foreach (Process p in allProcesses )
            {
                if ((p.Id != thisProcess.Id) && (p.MainModule.FileName == thisProcess.MainModule.FileName))
                {
                    otherProcess = p;
                    break;
                }
            }
    
           if (otherProcess != null)
           {
               //note IntPtr expected by API calls.
               IntPtr hWnd = otherProcess.MainWindowHandle;
               //restore if minimized
               ShowWindow(hWnd ,1);
               //bring to the front
               SetForegroundWindow (hWnd);
           }
            else
            {
                //run your app here
            }
    

    There is another question about this here

    0 讨论(0)
提交回复
热议问题