C#只允许启动一个WinFrom进程的两种方法

  1. 方法一:只禁止多个进程运行
  2. [STAThread]
  3. public static void Main()
  4. {
  5.     bool ret;
  6.     System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);
  7.     if (ret)
  8.     {  System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   
  9.         System.Windows.Forms.Application.DoEvents();
  10.         System.Windows.Forms.Application.Run(new Main());
  11.         //   Main   为你程序的主窗体,如果是控制台程序不用这句   
  12.         mutex.ReleaseMutex();
  13.     }
  14.     else
  15.     {
  16.         MessageBox.Show(null"有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。//n//n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  17.         //   提示信息,可以删除。   
  18.         Application.Exit();//退出程序   
  19.     }
  20. }
  21. 方法二:禁止多个进程运行,并当重复运行时激活以前的进程
  22. [STAThread]
  23. public static void Main()
  24. {
  25.     //Get   the   running   instance.   
  26.     Process instance = RunningInstance();
  27.     if (instance == null)
  28.     {  System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   
  29.         System.Windows.Forms.Application.DoEvents();
  30.         //There   isn't   another   instance,   show   our   form.   
  31.         Application.Run(new Main());
  32.     }    
  33.     else
  34.     {
  35.         //There   is   another   instance   of   this   process.   
  36.         HandleRunningInstance(instance);
  37.     }
  38. }
  39. public static Process RunningInstance()
  40. {
  41.     Process current = Process.GetCurrentProcess();
  42.     Process[] processes = Process.GetProcessesByName(current.ProcessName);
  43.     //Loop   through   the   running   processes   in   with   the   same   name   
  44.     foreach (Process process in processes)
  45.     {
  46.         //Ignore   the   current   process   
  47.         if (process.Id != current.Id)
  48.         {
  49.             //Make   sure   that   the   process   is   running   from   the   exe   file.   
  50.             if (Assembly.GetExecutingAssembly().Location.Replace("/""") == current.MainModule.FileName)
  51.             {
  52.                 //Return   the   other   process   instance.   
  53.                 return process;
  54.             }
  55.         }
  56.     }
  57.     //No   other   instance   was   found,   return   null. 
  58.     return null;
  59. }
  60. public static void HandleRunningInstance(Process instance)
  61. {
  62.     //Make   sure   the   window   is   not   minimized   or   maximized   
  63.     ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
  64.     //Set   the   real   intance   to   foreground   window
  65.     SetForegroundWindow(instance.MainWindowHandle);
  66. }
  67. [DllImport("User32.dll")]
  68. private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  69. [DllImport("User32.dll")]
  70. private static extern bool  SetForegroundWindow(IntPtr hWnd);
  71. private const int WS_SHOWNORMAL = 1;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值