第一種方法 (建議用這個,我已經測試) 代碼如下
【1.】
using System;using System.Collections.Generic;using System.Windows.Forms;//using RFIDWareHouse.View;using System.Runtime.InteropServices;namespace Phone{ static class Program { [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); private const int ERROR_ALREADY_EXISTS = 0183; [StructLayout(LayoutKind.Sequential)] public class SECURITY_ATTRIBUTES { public int nLength; public int lpSecurityDescriptor; public int bInheritHandle; } /// <summary> /// 應用程式的主進入點。 /// </summary> [MTAThread] static void Main() { // Application.Run(new frMain()); IntPtr hMutex = CreateMutex(null, false, "Futureproduct"); if (GetLastError() != ERROR_ALREADY_EXISTS) { System.Windows.Forms.Application.Run(new frMain()); return; } else { MessageBox.Show("程式已經啟動."); ReleaseMutex(hMutex); return; } } }}
【2】
第二種方法:
public class Mutex{[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);private const int ERROR_ALREADY_EXISTS = 0183;/// <summary>/// 判斷程式是否已經運行/// </summary>/// <returns>/// true: 程式已運行,則什麼都不做/// false: 程式未運行,則啟動程式/// </returns>public static bool IsExist(){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() == ERROR_ALREADY_EXISTS){ReleaseMutex(hMutex);return true;}return false;}}
【3.】
讓程式只啟動一次
-- Mutex有時在開發程式的時候, 有時需要只能同時運行一個執行個體.
Mutex 類, 稱為互拆體, 是一個同步基元, 它只向一個線程授予對共用資源的獨佔訪問權。
當兩個或更多線程需要同時訪問一個共用資源時,系統需要使用同步機制來確保一次只有一個線程使用該資源。
如果一個線程擷取了互斥體,則要擷取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。
下面示範 Mutex 類來保證應用程式只有唯一執行個體
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;namespace 讓程式只啟動一次{ static class Program { /// <summary> /// 應用程式的主進入點。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); bool bCreate; System.Threading.Mutex mutex = new System.Threading.Mutex(false, "SINGILE_INSTANCE_MUTEX", out bCreate); if (bCreate) { Application.Run(new Form1()); } else { MessageBox.Show("程式已經啟動"); Application.Exit(); } } }}
我之前 也很苦惱 有的程式可以 只能開啟程式一次
但是 有的程式為什麼不行啊 代碼都一樣,你有沒有發現 這是什麼問題??
如果 上面的方法 都不起作用 嘗試下面的這個方法
【4。】
using System;using System.Linq;using System.Collections.Generic;using System.Windows.Forms;using System.Runtime.InteropServices;namespace PDAapplication{ static class Program { /// <summary> /// 應用程式的主進入點。 /// </summary> [MTAThread] static void Main() { //Application.Run(new forApplicatinesMan()); IntPtr hDlg=IntPtr.Zero; hDlg = FindWindow(null, "ThisWindows");//ThisWindows:應用程式主表單 if (hDlg != IntPtr.Zero) { SetForegroundWindow(hDlg); } else { Application.Run(new forApplicatinesMan()); } } [DllImport("coredll.Dll")] public static extern IntPtr FindWindow(String classname, String title); [DllImport("coredll.Dll")] public static extern void SetForegroundWindow(IntPtr hwnd); }}