Winform exe程序防重复运行

两种方法实现效果:方法一是提示程序重复运行(简单,比较轻量);方法二是弹出已经打开的程序窗口来实现(人性化,复杂);   

方法一:主要是对程序主进程的控制,在程序入口代码处创建一个互斥体,使得主程序只能存在一个,主要是在 Program.cs 中来实现,默认Program.cs代码如下:

 static class Program
        {
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            public static Process RunningInstance() 
            {
                throw new NotImplementedException(); 
             }
        
         }

修改后代码如下: 

 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点,程序同时只能运行一个
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool createNew;
            using (Mutex m = new Mutex(true, Application.ProductName, out createNew))
            {
                if (createNew)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Main());   //其中 Main为窗体ID,默认是 Form1
                }
                else
                {
                    MessageBox.Show("程序已运行,请勿重复运行!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                }
            }
        }
    }

方法二:命名空间引用

using System.Reflection;
using System.Diagnostics;
using System.Runtime.InteropServices;

代码如下(可直接拷贝使用 注意修改主窗体ID名): 

static class Program
    {
        /// <summary>
        /// 应用程序的主入口点,程序同时只能运行一个
        /// </summary>
        [STAThread]
        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
        [DllImport("User32.dll")]
         private static extern bool SetWindow(IntPtr hWnd);
        private const int SW_SHOW = 1;
        static void Main()
        {
            Process process = RunningProcessInstance(); if (process != null)
            {
                HandleRunningInstance(process);
                System.Environment.Exit(1);
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Main()); //这里默认是主界面的Form1         
        }
        private static void HandleRunningInstance(Process instance)
        {
            ShowWindowAsync(instance.MainWindowHandle, SW_SHOW);                
            SetWindow(instance.MainWindowHandle); //运行的程序显示到最前端         
        }
        public static Process RunningProcessInstance()
        {
            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;
            throw new NotImplementedException();
        }        
     }               
   }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌霜残雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值