WinFrom 只能运行一个实例总结

简介: WinFrom 只能运行一个实例总结

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();//退出程序


           }


       }


   }


}


目录
相关文章
|
移动开发 前端开发 HTML5
Phaser 桌面和手机游戏HTML5框架
Phaser是一个流行的2D开源游戏框架,可以用来开发桌面或手机浏览器HTML5游戏,适合侧视或顶视风格: Phaser同时支持Canvas和WebGL渲染引擎,预置了完备的精灵动画、输入 管理、瓦片地图、补间动画、资源加载器、物理系统、粒子系统等特性,几乎能够 满足你开发一个2D游戏的任何需求: Phaser最值得称道的是它的插件机制,以及由此而衍生出的Phaser生态 社区。
1730 0
nrm使用与安装
nrm使用与安装
461 0
nrm使用与安装
|
数据采集 分布式计算 Oracle
数据仓库的分层架构与演进
分层架构很容易在各种书籍和文档中去理解,但是把建模方法和分层架构放在一起就会出现很多困惑了。接下来,我会从数据研发与建模的角度,演进一下分层架构的设计原因与层次的意义。
16345 3
数据仓库的分层架构与演进
|
8月前
|
存储 Java 数据库
Java一分钟之-JPA实体监听器:@PrePersist, @PostLoad
【6月更文挑战第15天】JPA实体监听器通过`@PrePersist`等注解在实体生命周期关键点执行逻辑,例如设置默认值或处理并发更新。常见问题包括监听器未注册、并发冲突和性能影响。示例展示了如何在`@PrePersist`中设置默认创建时间和`@PostLoad`时初始化关联数据。使用监听器能增强灵活性,但也需注意潜在问题和优化。
215 6
|
8月前
|
存储 数据管理 数据库
理解数据库中的参照完整性
【6月更文挑战第13天】数据库设计旨在创建和维护企业的数据管理系统,确保数据完整性和消除冲突。好的数据库设计应减少冗余,保证信息准确完整,并满足处理和报告需求。设计工具包括E-R图和UML等。
639 2
理解数据库中的参照完整性
|
5月前
|
数据采集 Web App开发 测试技术
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
在网络爬虫领域,Selenium与WebDriver是实现跨浏览器自动化数据抓取的利器。本文详细介绍了如何利用Selenium和WebDriver结合代理IP技术提升数据抓取的稳定性和效率。通过设置user-agent和cookie来模拟真实用户行为,避免被网站检测和阻止。文章提供了具体的代码示例,展示了如何配置代理IP、设置user-agent和cookie,并实现了跨浏览器的数据抓取。合理的参数配置能有效减少爬虫被封禁的风险,提高数据抓取效率。
646 6
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
|
8月前
|
Java API 数据库
Java一分钟之-JPA注解:@Entity, @Table, @Id等
【6月更文挑战第14天】Java Persistence API (JPA) 是Java开发中的ORM框架,通过注解简化数据访问层。本文介绍了三个核心注解:`@Entity`标识实体类,`@Table`自定义表名,`@Id`定义主键。易错点包括忘记添加`@Entity`、未正确设置主键。建议使用`@GeneratedValue`和`@Column`细化主键策略和字段映射。正确理解和应用这些注解能提高开发效率和代码质量。
505 3
|
9月前
|
监控 安全 数据库
数据库审计和监控
【4月更文挑战第11天】数据库审计与监控是保障数据库安全和稳定的关键。审计关注安全事件,实时记录和分析用户行为,用于合规报告、事故追踪及提升数据安全。监控则实时检测数据库性能、安全和可靠性,及时发现并解决潜在问题,防止崩溃和数据丢失,确保高可用性和稳定性。两者协同工作,强化数据库管理。
147 2

热门文章

最新文章