Files
mRemoteNG/mRemoteV1/App/ProgramRoot.cs
2018-05-22 21:31:22 -05:00

74 lines
2.5 KiB
C#

using mRemoteNG.UI.Forms;
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace mRemoteNG.App
{
public static class ProgramRoot
{
private static Mutex mutex;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
public static void Main(string[] args)
{
if (Settings.Default.SingleInstance)
StartApplicationAsSingleInstance();
else
StartApplication();
}
private static void StartApplication()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var frmMain = new FrmMain();
Application.Run(frmMain);
}
public static void CloseSingletonInstanceMutex()
{
mutex?.Close();
}
private static void StartApplicationAsSingleInstance()
{
const string mutexID = "mRemoteNG_SingleInstanceMutex";
bool newInstanceCreated;
mutex = new Mutex(false, mutexID, out newInstanceCreated);
if (!newInstanceCreated)
{
SwitchToCurrentInstance();
return;
}
StartApplication();
GC.KeepAlive(mutex);
}
private static void SwitchToCurrentInstance()
{
var singletonInstanceWindowHandle = GetRunningSingletonInstanceWindowHandle();
if (singletonInstanceWindowHandle == IntPtr.Zero) return;
if (NativeMethods.IsIconic(singletonInstanceWindowHandle) != 0)
NativeMethods.ShowWindow(singletonInstanceWindowHandle, (int)NativeMethods.SW_RESTORE);
NativeMethods.SetForegroundWindow(singletonInstanceWindowHandle);
}
private static IntPtr GetRunningSingletonInstanceWindowHandle()
{
var windowHandle = IntPtr.Zero;
var currentProcess = Process.GetCurrentProcess();
foreach (var enumeratedProcess in Process.GetProcessesByName(currentProcess.ProcessName))
{
if (enumeratedProcess.Id != currentProcess.Id && enumeratedProcess.MainModule.FileName == currentProcess.MainModule.FileName && enumeratedProcess.MainWindowHandle != IntPtr.Zero)
windowHandle = enumeratedProcess.MainWindowHandle;
}
return windowHandle;
}
}
}