Обновление 2017-01-25. Попробовав несколько вещей, я решил перейти на VisualBasic.dll, он проще и работает лучше (по крайней мере, для меня). Я оставил свой предыдущий ответ в качестве ссылки ...
Так же, как ссылка, это то, что я делал без передачи аргументов (что я не могу найти для этого никакой причины ... Я имею в виду одно приложение с аргументами, которые должны передаваться из одного экземпляра в другой) ,
Если требуется сопоставление файлов, то приложение (согласно стандартному ожиданию пользователя) должно быть создано для каждого документа. Если вам нужно передать аргументы в существующее приложение, я думаю, что я бы использовал vb dll.
Не передавая аргументы (только приложение с одним экземпляром), я предпочитаю не регистрировать новое сообщение Window и не перезаписывать цикл сообщений, как это определено в Matt Davis Solution. Хотя добавить VisualBasic dll не составляет особого труда, но я предпочитаю не добавлять новую ссылку только для создания приложения с одним экземпляром. Кроме того, я предпочитаю создавать новый класс с помощью Main вместо вызова Shutdown из переопределения App.Startup, чтобы обеспечить выход как можно скорее.
В надежде, что это кому-нибудь понравится ... или немного вдохновит :-)
Класс запуска проекта должен быть установлен как «SingleInstanceApp».
public class SingleInstanceApp
{
[STAThread]
public static void Main(string[] args)
{
Mutex _mutexSingleInstance = new Mutex(true, "MonitorMeSingleInstance");
if (_mutexSingleInstance.WaitOne(TimeSpan.Zero, true))
{
try
{
var app = new App();
app.InitializeComponent();
app.Run();
}
finally
{
_mutexSingleInstance.ReleaseMutex();
_mutexSingleInstance.Close();
}
}
else
{
MessageBox.Show("One instance is already running.");
var processes = Process.GetProcessesByName(Assembly.GetEntryAssembly().GetName().Name);
{
if (processes.Length > 1)
{
foreach (var process in processes)
{
if (process.Id != Process.GetCurrentProcess().Id)
{
WindowHelper.SetForegroundWindow(process.MainWindowHandle);
}
}
}
}
}
}
}
WindowHelper:
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Threading;
namespace HQ.Util.Unmanaged
{
public class WindowHelper
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);