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());
}