Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
RunMainForm(autoStart, hide, service);
SingleInstance.ReleaseMutex();
SingleInstance类
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
using System;
using System.Collections.Generic;
using System.Text;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Threading;
using System.Reflection;
using System.Runtime.InteropServices;// win API 引用
using System.Diagnostics;//Process
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace QueuerServer
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 使应用程序仅运行一个实例。
/// </summary>
static class SingleInstance
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static Mutex mutex = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static bool CreateMutex()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return CreateMutex(Assembly.GetEntryAssembly().FullName);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static bool CreateMutex(string name)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
bool result = false;
mutex = new Mutex(true, name, out result);
return result;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void ReleaseMutex()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (mutex != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
mutex.Close();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// ShowWindow() Commands
/// </summary>
private const int SW_HIDE = 0;
private const int SW_SHOWNORMAL = 1;
private const int SW_NORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_MAXIMIZE = 3;
private const int SW_SHOWNOACTIVATE = 4;
private const int SW_SHOW = 5;
private const int SW_MINIMIZE = 6;
private const int SW_SHOWMINNOACTIVE = 7;
private const int SW_SHOWNA = 8;
private const int SW_RESTORE = 9;
private const int SW_SHOWDEFAULT = 10;
private const int SW_FORCEMINIMIZE = 11;
private const int SW_MAX = 11;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 激活同Instance窗体
/// </summary>
/// <param name="instance"></param>
/// <returns></returns>
public static bool HandleRunningInstance(Process instance)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle, SW_MAXIMIZE);
//设置为foreground window
return SetForegroundWindow(instance.MainWindowHandle);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static bool HandleRunningInstance()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Process p = GetRunningInstance();
if (p != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
HandleRunningInstance(p);
return true;
}
return false;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 获取应用程序进程实例,如果没有匹配进程,返回Null值
/// </summary>
/// <returns></returns>
public static Process GetRunningInstance()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Process currentProcess = Process.GetCurrentProcess(); //获取当前进程
//获取当前运行程序完全限定名
string currentFileName = currentProcess.MainModule.FileName;
//获取进程名为ProcessName的Process数组。
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);
//遍历有相同进程名称正在运行的进程
foreach (Process process in processes)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (process.MainModule.FileName == currentFileName)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (process.Id != currentProcess.Id) //根据进程ID排除当前进程
return process;//返回已运行的进程实例
}
}
return null;
}
}
}
主工程中:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Program
namespace QueuerServer
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
static class Program
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private static MainForm m_MainForm;
public static MainForm MainForm
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return Program.m_MainForm; }
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
#region
bool autoStart = false;
bool hide = false;
bool service = false;
foreach (string arg in args)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//MessageBox.Show(arg);
string command = arg.Trim().ToLower();
//if(arg.Trim().ToLower().Equals("-autostart"))
switch (command)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case "-autostart":
autoStart = true;
break;
case "-hide":
hide = true;
break;
case "-service":
service = true;
break;
default:
break;
}
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//使应用程序只能生成一个进程
if (SingleInstance.CreateMutex())
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
RunMainForm(autoStart, hide, service);
SingleInstance.ReleaseMutex();
}
else//若已经运行了一个进程,则激活该进程。
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//MessageBox.Show("程序已经运行!");
SingleInstance.HandleRunningInstance();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new MainForm(autoStart, hide, service));
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static void RunMainForm(bool autoStart, bool hide, bool service)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
try
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
CreateMainForm(autoStart, hide, service);
}
catch (Exception e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (DialogResult.OK == MessageBox.Show(e.Message, "应用程序错误", MessageBoxButtons.OKCancel))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//这是一个重新启动机制,但是丢失全部应用程序信息。
RunMainForm(autoStart, hide, service);
}
//XMLMessageManager.WriteExceptionToLog(e);
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private static void CreateMainForm(bool autoStart, bool hide, bool service)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (m_MainForm != null)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_MainForm.Dispose();
m_MainForm = null;
}
m_MainForm = new MainForm(autoStart, hide, service);
Application.Run(m_MainForm);
}
}
}