

public class SingleApplication
{
private const int SW_RESTORE = 9;
private static string sTitle;
private static IntPtr windowHandle;
/// <summary>
/// Imports
/// </summary>
[DllImport("user32.Dll")]
private static extern int EnumWindows(EnumWinCallBack callBackFunc, int lParam);
[DllImport("User32.Dll")]
private static extern void GetWindowText(int hWnd, StringBuilder str, int nMaxCount);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);
/// <summary>
/// EnumWindowCallBack
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private static bool EnumWindowCallBack(int hwnd, int lParam)
{
windowHandle = (IntPtr) hwnd;
StringBuilder sbuilder = new StringBuilder(256);
GetWindowText((int) windowHandle, sbuilder, sbuilder.Capacity);
string strTitle = sbuilder.ToString();
if (strTitle == sTitle)
{
ShowWindow(windowHandle, SW_RESTORE);
SetForegroundWindow(windowHandle);
return false;
}
return true;
} //EnumWindowCallBack
/// <summary>
/// Execute a form base application if another instance already running on
/// the system activate previous one
/// </summary>
/// <param name="frmMain">main form</param>
/// <returns>true if no previous instance is running</returns>
public static bool Run(Form frmMain)
{
sTitle = frmMain.Text;
if (EnumWindows(EnumWindowCallBack, 0) == 0)
{
return false;
}
Application.Run(frmMain);
return true;
}
public static bool Run(string frmText)
{
sTitle = frmText;
if (EnumWindows(EnumWindowCallBack, 0) == 0)
{
return false;
}
return true;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public static bool Run()
{
Process pr = Process.GetCurrentProcess();
string strProcessName = pr.ProcessName;
if (Process.GetProcessesByName(strProcessName).Length > 1)
{
return false;
}
return true;
}
#region Nested type: EnumWinCallBack
private delegate bool EnumWinCallBack(int hwnd, int lParam);
#endregion
}
调用方式:
if
(SingleApplication.Run(
"
Form1
"
))
//
Form1为应用程序入口窗体
Application.Run( new Form1());
// 或者
// if (SingleApplication.Run(new Form1().Text)) // Form1为应用程序入口窗体
// Application.Run(new Form1());
// 或者
// SingleApplication.Run(new Form1())
Application.Run( new Form1());
// 或者
// if (SingleApplication.Run(new Form1().Text)) // Form1为应用程序入口窗体
// Application.Run(new Form1());
// 或者
// SingleApplication.Run(new Form1())