標籤:winform style blog color os io strong ar for
方法一: 禁止多個進程運行
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;namespace 開啟新的進程{ static class Program { /// <summary> /// 應用程式的主進入點。 /// </summary> [STAThread] static void Main() { bool flag; System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out flag); if (flag) { // 啟用應用程式的可視樣式 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 處理當前在訊息佇列中的所有 Windows 訊息 Application.DoEvents(); Application.Run(new Form1()); // 釋放 System.Threading.Mutex 一次 mutex.ReleaseMutex(); } else { MessageBox.Show(null, "相同的程式已經在運行了,請不要同時運行多個程式!\n\n這個程式即將退出!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); Application.Exit(); } } }}
方法二: 禁止多個進程運行,併當重複運行時啟用以前的進程
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using System.Diagnostics;using System.Reflection;using System.Runtime.InteropServices;namespace 開啟新的進程{ static class Program { /// <summary> /// 應用程式的主進入點。 /// </summary> [STAThread] static void Main() { System.Diagnostics.Process instance = RunningInstance(); if (instance == null) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } else { HandleRunningInstance(instance); } } /// <summary> /// 擷取當前正在啟動並執行進程執行個體 /// </summary> /// <returns></returns> public static Process RunningInstance() { // 擷取當前活動的進程 Process current = Process.GetCurrentProcess(); // 擷取當前本機電腦上指定的進程名稱的所有進程 Process[] processes = Process.GetProcessesByName(current.ProcessName); foreach (Process process in processes) { // 忽略當前進程 if (process.Id != current.Id) { if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) { return process; } } } // 如果沒有其他同名進程存在,則返回 null return null; } // 指示該屬性化方法由非託管動態連結程式庫 (DLL) 作為靜態進入點公開 [DllImport("User32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); [DllImport("User32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); private const int WS_SHOWNORMAL = 1; /// <summary> /// 如果有另一個同名進程啟動,則調用之前的執行個體 /// </summary> /// <param name="instance"></param> private static void HandleRunningInstance(Process instance) { // 確保表單不是最小化或者最大化 ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); // 將之前啟動的進程執行個體弄到前台視窗 SetForegroundWindow(instance.MainWindowHandle); } }}
WinForm 應用程式禁止多個進程運行