C# 創建互斥進程(程序) 互斥進程(程序), 簡單點說,就是在系統中只能有該程序的一個實例運行. 現在很多軟件都有這功能.
要實現程序的互斥,通常有下面幾種方式,下面用 C# 語言來實現:
方法一:
使用線程互斥變量. 通過定義互斥變量來判斷是否已運行實例.
把program.cs文件裡的Main()函數改為如下代碼:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace NetTools
{
static class Program
{
[DllImport("user32.dll")]
private static extern bool FlashWindow(IntPtr hWnd, bool bInvert);
[DllImport("user32.dll")]
private static extern bool FlashWindowEx(int pfwi);
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
{
bool runone;
System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone);
if (runone)
{
run.ReleaseMutex();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FrmRemote frm = new FrmRemote();
int hdc = frm.Handle.ToInt32(); // write to ...
Application.Run(frm);
IntPtr a = new IntPtr(hdc);
}
else
{
MessageBox.Show("已經運行了一個實例了。");
//IntPtr hdc = new IntPtr(1312810); // read from...
//bool flash = FlashWindow(hdc, true);
}
}
}
}
說明:程序中通過語句 System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone);來創建一個互斥體變量run,其中"single_test"為互斥體名,在此方法返回時,如果創建了局部互斥體或指定的命名系統互斥體,則布爾值runone為true;如果指定的命名系統互斥體已存在,則為 false。已命名的互斥體是系統范圍的。
方法二:采用判斷進程的方式,我們在運行程序前,查找進程中是否有同名的進程,同時運行位置也相同程,如是沒有運行該程序,如果有就就不運行.在C#中應用System.Diagnostics名字空間中的Process類來實現,主要代碼如下:
1,在program.cs文件中添加函數如下: