WinFrom 只能运行一个实例总结

举报
AI浩 发表于 2021/12/23 01:32:58 2021/12/23
【摘要】 WinFrom 只能运行一个实例以及全局异常处理 using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp1 {     static class Program &n...

WinFrom 只能运行一个实例以及全局异常处理

using System;

using System.Threading;

using System.Windows.Forms;

namespace WindowsFormsApp1

{

    static class Program

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main()

        {

            bool _bInitiallyOwned = true;

            bool _bIsCreated;

            Mutex m = new Mutex(_bInitiallyOwned, "ce08415e ", out _bIsCreated);

            if (!(_bInitiallyOwned && _bIsCreated))

            {

                MessageBox.Show("已有一个程序的实例在运行。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                Application.Exit();

            }

            else

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                #region 最高级别的异常处理情况  

                AppDomain currentDomain = AppDomain.CurrentDomain;

                currentDomain.UnhandledException += new UnhandledExceptionEventHandler(TopLevelExceptionHandler);

                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

                Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

                #endregion

                Application.Run(new Form1());

            }

        }

       static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)

        {

            MessageBox.Show("非常抱歉,系统出现异常,请重新启动系统。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

            Application.Exit();

        }

        /// <summary>  

        /// 最高级别异常处理情况  

        /// </summary>  

        /// <param name="sender"></param>  

        /// <param name="args"></param>  

        private static void TopLevelExceptionHandler(object sender, UnhandledExceptionEventArgs args)

        {

            MessageBox.Show("非常抱歉,系统出现异常,请重新启动系统。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

            Application.Exit();

        }

    }

}

C# WinForm 只允许运行一个实例 ,如果有就激活到前段

  C# WinForm 如果已经有其实例在运行,再运行新的实例就只闪一下屏幕,什么也看不到,导致不知所错。其实它的实例已经在“任务管理器”中,如果想结束它,可以按以下三个组合键 Ctrl + Alt + Del,点击其中的“任务管理器”进入Windows任务管理器,再点击“进程”页面,点选你的进程,再按“结束进程”将其结束。

  以下代码只允许 C# WinForm 运行一个实例 ,如果已经有其实例在运行,就将其窗口激活到前段显示。

主要代码如下:

using System;

//只运行一个实例

using System.Diagnostics;

using System.Reflection;

using System.Runtime.InteropServices;

using System.Windows.Forms;

namespace WindowsFormsINI

{

    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 Form1());

            }

            else

            {

                //1.2 已经有一个实例在运行

                HandleRunningInstance(instance);

            }

        }

        //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)

        {

            MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

            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

    }

}

C# WinForm 只运行一个程序实例

方法一:

using System;

//只运行一个实例

using System.Diagnostics;

using System.Reflection;

using System.Runtime.InteropServices;

using System.Windows.Forms;

namespace WindowsFormsINI

{

    static class Program

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main()

        {

            Process instance = RunningInstance();

            if (instance == null)

            {

                //没有实例在运行

                Application.Run(new Form1());

            }

            else

            {

                //已经有一个实例在运行

                HandleRunningInstance(instance);

            }

        }

        #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;

        }

 

        private static void HandleRunningInstance(Process instance)

        {

            MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

            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

    }

}

方法二:

using System;

//只运行一个实例

using System.Diagnostics;

using System.Reflection;

using System.Runtime.InteropServices;

using System.Windows.Forms;

namespace WindowsFormsINI

{

    static class Program

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main()

        {

            bool ret;

            System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out ret);

            if (ret)

            {

                System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格 

                System.Windows.Forms.Application.DoEvents();

                System.Windows.Forms.Application.Run(new Form1());

                //  frmMain   为你程序的主窗体,如果是控制台程序不用这句 

                m.ReleaseMutex();

            }

            else

            {

                MessageBox.Show(null, "有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);

                // 提示信息,可以删除。 

                Application.Exit();//退出程序 

            }

        }

    }

}

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/105418386

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。