C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错。
 

为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实例,而且能实现当程序在运行时,再去双击程序图标,直接呼出已经运行的程序。
 
下面看代码,只需在程序的入口文件中加如下代码即可:
 

static class Program
{  
  /// <summary>  
  /// 应用程序的主入口点。  
  /// </summary>  
  [STAThread] 
 static void Main() 
 {    
        Application.EnableVisualStyles();    
        Application.SetCompatibleTextRenderingDefault(false);     

        //1.这里判定是否已经有实例在运行    
        //只运行一个实例    
       Process instance = RunningInstance();    
       if (instance == null)    {      //1.1 没有实例在运行      
             Application.Run(new frmMain());   
       }    else    {      //1.2 已经有一个实例在运行      
            HandleRunningInstance(instance);    
       }     
       //Application.Run(new frmMain());   
    }   

   //2.在进程中查找是否已经有实例在运行  
#region 确保程序只运行一个实例  
private 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;        
          }      
       }    
   }    
   return null;  
}  

//3.已经有了就把它激活,并将其窗口放置最前端 
 private static void HandleRunningInstance(Process instance) 
 {    
        ShowWindowAsync(instance.MainWindowHandle, 1); 
        //调用api函数,正常显示窗口    
       SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端  
}  [DllImport("User32.dll")]  

private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);  [DllImport("User32.dll")]  

private static extern bool SetForegroundWindow(System.IntPtr hWnd); 

 #endregion} 

转载于:https://my.oschina.net/u/582827/blog/1544828

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值