如何强制C#.net应用程序在Windows中只运行一个实例?
可能重复:
什么是创build单个实例应用程序的正确方法?
如何强制C#.net应用程序在Windows中只运行一个实例?
我更喜欢类似于以下的互斥解决scheme。 就这样,如果它已经被加载,它将重新关注应用程序
using System.Threading; [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { bool createdNew = true; using (Mutex mutex = new Mutex(true, "MyApplicationName", out createdNew)) { if (createdNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { Process current = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(current.ProcessName)) { if (process.Id != current.Id) { SetForegroundWindow(process.MainWindowHandle); break; } } } } }
在.net(C#)中强制运行一个程序的一个例程在program.cs文件中使用此代码:
public static Process PriorProcess() // Returns a System.Diagnostics.Process pointing to // a pre-existing process with the same name as the // current one, if any; or null if the current process // is unique. { Process curr = Process.GetCurrentProcess(); Process[] procs = Process.GetProcessesByName(curr.ProcessName); foreach (Process p in procs) { if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName)) return p; } return null; }
和以下:
[STAThread] static void Main() { if (PriorProcess() != null) { MessageBox.Show("Another instance of the app is already running."); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form()); }
这是我在我的应用程序中使用的:
static void Main() { bool mutexCreated = false; System.Threading.Mutex mutex = new System.Threading.Mutex( true, @"Local\slimCODE.slimKEYS.exe", out mutexCreated ); if( !mutexCreated ) { if( MessageBox.Show( "slimKEYS is already running. Hotkeys cannot be shared between different instances. Are you sure you wish to run this second instance?", "slimKEYS already running", MessageBoxButtons.YesNo, MessageBoxIcon.Question ) != DialogResult.Yes ) { mutex.Close(); return; } } // The usual stuff with Application.Run() mutex.Close(); }
另一种单一实例应用程序的方法是检查他们的哈希总和。 在互斥之后(没有工作,因为我想)我得到它的工作方式:
[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); public Main() { InitializeComponent(); Process current = Process.GetCurrentProcess(); string currentmd5 = md5hash(current.MainModule.FileName); Process[] processlist = Process.GetProcesses(); foreach (Process process in processlist) { if (process.Id != current.Id) { try { if (currentmd5 == md5hash(process.MainModule.FileName)) { SetForegroundWindow(process.MainWindowHandle); Environment.Exit(0); } } catch (/* your exception */) { /* your exception goes here */ } } } } private string md5hash(string file) { string check; using (FileStream FileCheck = File.OpenRead(file)) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] md5Hash = md5.ComputeHash(FileCheck); check = BitConverter.ToString(md5Hash).Replace("-", "").ToLower(); } return check; }
它只通过进程ID检查md5总和。
如果find了这个应用程序的一个实例,它就会关注正在运行的应用程序并退出。
你可以重命名它,或者做你想要的文件。 它不会打开两次,如果MD5哈希是相同的。
可能有人有build议吗? 我知道这是回答,但也许有人正在寻找一个互斥的select。