当我们需要只启动一个C#程序实例的时候,一个比较标准的做法是,在程序入口使用一个互斥量来判断是否本程序已经启动,如果程序已经启动则将已经启动的程序激活。代码如下(以WPF为例):
App.xaml:
<Application x:Class="TestOneInstanceOnly.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
</Application.Resources>
</Application>
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
namespace TestOneInstanceOnly
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
private readonly string _appId = "a03484f1-7423-4faa-878a-a9eef271780d";
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if (IsExists())
{
var currentProcess = Process.GetCurrentProcess();
foreach (var process in Process.GetProcessesByName(currentProcess.ProcessName))
{
if (process.Id != currentProcess.Id)
{
SetForegroundWindow(process.MainWindowHandle);
break;
}
}
Shutdown(1);
return;
}
StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
}
private static Mutex _mutex;//避免被作为垃圾回收。
/// <summary>
/// 使用互斥量判断程序是否已经运行。
/// </summary>
/// <returns>已经运行返回true,否则返回false。</returns>
internal bool IsExists()
{
bool creatNew;
_mutex = new Mutex(true, _appId, out creatNew);
if (creatNew)
{
GC.KeepAlive(_mutex);
return false;
}
return true;
}
}
}
转载请注明出处。