一、使用用互斥量(System.Threading.Mutex)
同步基元,它只向一個(gè)線程授予對(duì)共享資源的獨(dú)占訪問(wèn)權(quán)。在程序啟動(dòng)時(shí)候,請(qǐng)求一個(gè)互斥體,如果能獲取對(duì)指定互斥的訪問(wèn)權(quán),就職運(yùn)行一個(gè)實(shí)例。
代碼
bool createNew;
using (System.Threading.Mutex mutex =new System.Threading.Mutex(true, Application.ProductName, out createNew))
{
if (createNew)
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("應(yīng)用程序已經(jīng)在運(yùn)行中...")
System.Threading.Thread.Sleep(1000);
System.Environment.Exit(1);
}
}
二、使用進(jìn)程名
代碼
Process[] processes = System.Diagnostics.Process.GetProcessesByName(Appl ication.CompanyName);
if (processes.Length >1)
{
MessageBox.Show("應(yīng)用程序已經(jīng)在運(yùn)行中。。");
Thread.Sleep(1000);
System.Environment.Exit(1);
}
else
{
Application.Run(new Form1());
}
三、調(diào)用Win32 API,并激活并程序的窗口,顯示在最前端
代碼
/// 該函數(shù)設(shè)置由不同線程產(chǎn)生的窗口的顯示狀態(tài)
///</summary>
///<param >窗口句柄</param>
///<param >指定窗口如何顯示。查看允許值列表,請(qǐng)查閱ShowWlndow函數(shù)的說(shuō)明部分</param>
///<returns>如果函數(shù)原來(lái)可見(jiàn),返回值為非零;如果函數(shù)原來(lái)被隱藏,返回值為零</returns>
[DllImport("User32.dll")]
privatestaticexternbool ShowWindowAsync(IntPtr hWnd, int cmdShow);
///<summary>
/// 該函數(shù)將創(chuàng)建指定窗口的線程設(shè)置到前臺(tái),并且激活該窗口。鍵盤(pán)輸入轉(zhuǎn)向該窗口,并為用戶(hù)改各種可視的記號(hào)。
/// 系統(tǒng)給創(chuàng)建前臺(tái)窗口的線程分配的權(quán)限稍高于其他線程。
///</summary>
///<param >將被激活并被調(diào)入前臺(tái)的窗口句柄</param>
///<returns>如果窗口設(shè)入了前臺(tái),返回值為非零;如果窗口未被設(shè)入前臺(tái),返回值為零</returns>
[DllImport("User32.dll")]
privatestaticexternbool SetForegroundWindow(IntPtr hWnd);
代碼
privateconstint SW_SHOWNOMAL =1;
privatestaticvoid HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, SW_SHOWNOMAL);//顯示
SetForegroundWindow(instance.MainWindowHandle);//當(dāng)?shù)阶钋岸?
}
privatestatic Process RuningInstance()
{
Process currentProcess = Process.GetCurrentProcess();
Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessN ame);
foreach (Process process in Processes)
{
if (process.Id != currentProcess.Id)
{
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == currentProcess.MainModule.FileName)
{
return process;
}
}
}
returnnull;
}
代碼
Process process = RuningInstance();
if (process ==null)
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("應(yīng)用程序已經(jīng)在運(yùn)行中。。。");
HandleRunningInstance(process);
//System.Threading.Thread.Sleep(1000);
//System.Environment.Exit(1);
}
這里整理了三種方案,希望朋友們提出更多的解決方案




