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