У меня есть приложение, в котором одновременно может быть открыт только один экземпляр. Чтобы добиться этого, я использую этот код:
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
foreach (System.Diagnostics.Process p in myProcesses)
{
if (p.ProcessName == me.ProcessName)
if (p.Id != me.Id)
{
//if already running, abort this copy.
return;
}
}
//launch the application.
//...
Работает нормально. Еще хотелось бы, чтобы можно было сфокусировать форму уже работающей копии. То есть, прежде чем вернуться, я хочу вывести на передний план другой экземпляр этого приложения.
Как мне это сделать?
Re: SetForeGroundWindow:
SetForeGroundWindow работает до определенной степени:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//...
if (p.Id != me.Id)
{
//if already running, focus it, and then abort this copy.
SetForegroundWindow(p.MainWindowHandle);
return;
}
//...
Это выводит окно на передний план, если оно не свернуто. Потрясающий. Однако, если окно свернуто, оно остается свернутым.
Это нужно отменить сворачивание.
Решение через SwitchToThisWindow (работает!):
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
[STAThread]
static void Main()
{
System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcessesByName(me.ProcessName);
foreach (System.Diagnostics.Process p in myProcesses)
{
if (p.Id != me.Id)
{
SwitchToThisWindow(p.MainWindowHandle, true);
return;
}
}
//now go ahead and start our application ;-)