.NET CF:
[DllImport("coredll.Dll")] private static extern int GetLastError(); [DllImport("coredll.Dll")] private static extern int ReleaseMutex(IntPtr hMutex); [DllImport("coredll.Dll")] private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes,
bool bInitialOwner,
string lpName); [StructLayout( LayoutKind.Sequential)] public class SECURITY_ATTRIBUTES { public int nLength; public int lpSecurityDescriptor; public int bInheritHandle; } const int ERROR_ALREADY_EXISTS = 0183;
static void Main() { #region Api_Call CreateMutex; IntPtr hMutex; hMutex=CreateMutex(null,false,"程序名"); if (GetLastError()!=ERROR_ALREADY_EXISTS) { Application.Run(new Frmmenu()); } else { MessageBox.Show("本程序只允许同时运行一个"); ReleaseMutex(hMutex); } #endregion }
EVC:
HANDLE hMutex=::CreateMutex(NULL,TRUE,L"LiCR"); if(hMutex!=NULL) { if(GetLastError()==ERROR_ALREADY_EXISTS) {
AfxMessageBox( "已经有一个程序运行." );
ReleaseMutex(hMutex);
return FALSE;
}
}
大部分网站就只提供到这一步,但是在实际操作过程中,有时还是会打开多个实例,下面提供一个方式,再次单击时,打开第一个实例,经实际测试,通过
[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitiaOwner, string lpName);
[DllImport("coredll.dll", SetLastError = true)]
public static extern int ReleaseMutex(IntPtr hMutex);
[DllImport("coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("coredll.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
public const int ERROR_ALREADY_EXISTS = 183;
public const int SW_SHOW = 5;public static LoginForm MainWindow;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[MTAThread]
static void Main()
{
IntPtr hMutex = CreateMutex(IntPtr.Zero, false, @"GprsPatrolNtV2");if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS)
{
IntPtr mainFrm = FindWindow(null, GlobalSetting.ApplicationTitle);
ShowWindow(mainFrm, SW_SHOW);
SetForegroundWindow(mainFrm);
Application.Exit();
}
else
{
MainWindow = new LoginForm();
Application.Run(MainWindow);ReleaseMutex(hMutex);
}
}