C#写winForm程序和WinCE程序,实现单实例运行的代码是不一样的。收集多人的代码,测试成功,放在这里大家借鉴。
一、WinForm简单。
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool runone;
System.Threading.Mutex run = new System.Threading.Mutex(true, Application.ProductName, out runone);//核心代码
if (runone == true)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainImpExp());
}
else
{
MessageBox.Show("已经运行了一个实例了。");
Application.Exit();
}
}
}
二、Wince复杂。
#region OpenNETCF native interface to mutex generation (version 1.4 of the SDF)
public const Int32 NATIVE_ERROR_ALREADY_EXISTS = 183;
#region P/Invoke Commands for Mutexes
[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
public static extern IntPtr CreateMutex(
IntPtr lpMutexAttributes,
bool InitialOwner,
string MutexName);
[DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
public static extern bool ReleaseMutex(IntPtr hMutex);
#endregion
public static bool IsInstanceRunning()
{
string strAppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
IntPtr hMutex = CreateMutex(IntPtr.Zero, true, strAppName);
if (hMutex == IntPtr.Zero)
{
throw new ApplicationException("Failure creating mutex: " + Marshal.GetLastWin32Error().ToString("X"));
}
if (Marshal.GetLastWin32Error() == NATIVE_ERROR_ALREADY_EXISTS)
{
return true;
}
else
{
return false;
}
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[MTAThread]
static void Main()
{
if (IsInstanceRunning())//核心代码
MessageBox.Show("已经运行");
else
Application.Run(new MainF());
}