C#程序只允许运行一个实例的解决方案
生活随笔
收集整理的這篇文章主要介紹了
C#程序只允许运行一个实例的解决方案
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近在做winform的程序中,需要只能打開一個程序,如果已經(jīng)存在,則激活該程序的窗口,并顯示在最前端。在網(wǎng)上google了一哈,找到了很多的解決方案。這里我整理了3種方案,并經(jīng)過了測試,現(xiàn)和朋友們分享:
一、使用用互斥量(System.Threading.Mutex)
?同步基元,它只向一個線程授予對共享資源的獨占訪問權(quán)。在程序啟動時候,請求一個互斥體,如果能獲取對指定互斥的訪問權(quán),就職運行一個實例。
代碼 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)在運行中...") System.Threading.Thread.Sleep(1000);
????????????????????System.Environment.Exit(1);
????????????????}
????????????}
二、使用進程名
代碼 Process[]?processes?=?System.Diagnostics.Process.GetProcessesByName(Application.CompanyName);????????????if?(processes.Length?>?1)
????????????{
????????????????MessageBox.Show("應(yīng)用程序已經(jīng)在運行中。。");
????????????????Thread.Sleep(1000);
????????????????System.Environment.Exit(1);
????????????}
????????????else
????????????{
????????????????Application.Run(new?Form1());
????????????}
三、調(diào)用Win32 API,并激活并程序的窗口,顯示在最前端
代碼 ///?該函數(shù)設(shè)置由不同線程產(chǎn)生的窗口的顯示狀態(tài)????????///?</summary>
????????///?<param?name="hWnd">窗口句柄</param>
????????///?<param?name="cmdShow">指定窗口如何顯示。查看允許值列表,請查閱ShowWlndow函數(shù)的說明部分</param>
????????///?<returns>如果函數(shù)原來可見,返回值為非零;如果函數(shù)原來被隱藏,返回值為零</returns>
????????[DllImport("User32.dll")]
????????private?static?extern?bool?ShowWindowAsync(IntPtr?hWnd,?int?cmdShow);
????????///?<summary>
????????///??該函數(shù)將創(chuàng)建指定窗口的線程設(shè)置到前臺,并且激活該窗口。鍵盤輸入轉(zhuǎn)向該窗口,并為用戶改各種可視的記號。
????????///??系統(tǒng)給創(chuàng)建前臺窗口的線程分配的權(quán)限稍高于其他線程。?
????????///?</summary>
????????///?<param?name="hWnd">將被激活并被調(diào)入前臺的窗口句柄</param>
????????///?<returns>如果窗口設(shè)入了前臺,返回值為非零;如果窗口未被設(shè)入前臺,返回值為零</returns>
????????[DllImport("User32.dll")]
????????private?static?extern?bool?SetForegroundWindow(IntPtr?hWnd); 代碼 private?const?int?SW_SHOWNOMAL?=?1;
????????private?static?void?HandleRunningInstance(Process?instance)
????????{
????????????ShowWindowAsync(instance.MainWindowHandle,?SW_SHOWNOMAL);//顯示
????????????SetForegroundWindow(instance.MainWindowHandle);//當(dāng)?shù)阶钋岸?br />????????}
????????private?static?Process?RuningInstance()
????????{
????????????Process?currentProcess?=?Process.GetCurrentProcess();
????????????Process[]?Processes?=?Process.GetProcessesByName(currentProcess.ProcessName);
????????????foreach?(Process?process?in?Processes)
????????????{
????????????????if?(process.Id?!=?currentProcess.Id)
????????????????{
????????????????????if?(Assembly.GetExecutingAssembly().Location.Replace("/",?"\\")?==?currentProcess.MainModule.FileName)
????????????????????{
????????????????????????return?process;
????????????????????}
????????????????}
????????????}
????????????return?null;
????????} 代碼 Process?process?=?RuningInstance();
????????????if?(process?==?null)
????????????{
????????????????Application.Run(new?Form1());
????????????}
????????????else
????????????{
????????????????MessageBox.Show("應(yīng)用程序已經(jīng)在運行中。。。"); HandleRunningInstance(process);
????????????????//System.Threading.Thread.Sleep(1000);
????????????????//System.Environment.Exit(1);
????????????}
總結(jié)
以上是生活随笔為你收集整理的C#程序只允许运行一个实例的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孟婆汤是什么意思(说一说孟婆汤是什么意思
- 下一篇: C# 中的yield使用