利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行。

  1. [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
  2. public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
  3. [DllImport("User32.dll")]
  4. private static extern bool SetForegroundWindow(IntPtr hWnd);
  5.  
  6. static SingleInstanceManager manager;
  7. /// <summary>
  8. /// 应用程序的主入口点。
  9. /// </summary>
  10. [STAThread]
  11. static void Main(string[] args)
  12. {
  13. Application.EnableVisualStyles();
  14. Application.SetCompatibleTextRenderingDefault(false);
  15. manager = new SingleInstanceManager(new Form5());
  16. manager.Run(args);
  17. }
  18.  
  19. public static void ShowForm(Form Nform, bool closeOldOne = true)
  20. {
  21. manager.ChangeForm(Nform, closeOldOne);
  22. }
  23.  
  24. public class SingleInstanceManager : WindowsFormsApplicationBase
  25. {
  26. ApplicationContext app;
  27.  
  28. public SingleInstanceManager(Form mainForm)
  29. {
  30. this.IsSingleInstance = true;
  31. app = new ApplicationContext();
  32. app.MainForm = mainForm;
  33. }
  34.  
  35. protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
  36. {
  37. Application.Run(app);
  38. return false;
  39. }
  40.  
  41. protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
  42. {
  43. base.OnStartupNextInstance(eventArgs);
  44. SetForegroundWindow(app.MainForm.Handle);
  45. ShowWindow(app.MainForm.Handle, );
  46. }
  47.  
  48. public void ChangeForm(Form newForm, bool closeOldOne = true)
  49. {
  50. if (app.MainForm == newForm) return;
  51. Form tem = app.MainForm;
  52. tem.Hide();
  53. app.MainForm = newForm;
  54. newForm.Show();
  55. if (closeOldOne) tem.Close();
  56. }
  57. }

单实例的类中有一个变量ApplicationContext,应用程序线程的上下文,这个变量是为了切换窗口而设计的。具体实现代码看下面的ChangeForm。

调用时,例如上面的Form5中有一个按钮,打开新窗口Form6,则:

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. Program.ShowForm(new Form6());
  4. }

只需要这样调用就能够切换窗口,关闭Form5,节约资源。

c#设计应用程序单实例运行的更多相关文章

  1. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  2. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  3. C++实现程序单实例运行的两种方式

    简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫 ...

  4. linux保证程序单实例运行

    static int proc_detect(const char *procname){ char filename[100] = {0}; sprintf(filename, "%s/% ...

  5. WinForm 登录窗体 + 单实例运行

    关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子. 然而两者结合起来呢? //Program.cs static class Program { public ...

  6. Winform 单实例运行

    Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...

  7. Windows进程单实例运行

    场景         Windows进程单实例运行,如果有进程没有退出,继续等待,直到进程完全退出,才会进入下一个实例 HANDLE pHandle = NULL; do  {  pHandle = ...

  8. c# 单实例运行

    /// <summary> /// 单实例运行程序 /// </summary> static void SingleInstanceRun() { bool isAppRun ...

  9. C#实现单实例运行

    C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 ...

随机推荐

  1. 【转载并整理】JAVA解析或生成xml的四种方法

    参考文章 1:http://blog.csdn.net/clemontine/article/details/53011362 2:http://www.jb51.net/article/98456. ...

  2. 解决sklearn 随机森林数据不平衡的方法

    Handle Imbalanced Classes In Random Forest   Preliminaries # Load libraries from sklearn.ensemble im ...

  3. [转]Spring mvc interceptor配置拦截器,没有登录跳到登录页

    <?xml  version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.s ...

  4. Python Tensorflow CNN 识别验证码

    Python+Tensorflow的CNN技术快速识别验证码 文章来源于: https://www.jianshu.com/p/26ff7b9075a1 验证码处理的流程是:验证码分析和处理—— te ...

  5. c#中lock的使用(用于预约超出限额的流程)

    一个项目,预约系统,核心二张表:预约表,预约限额表 用户点击预约按钮后, 1. 先select 预约限额表把该预约时间段的限额取出来, 2. 再select 预约表把该预约时间已经预约上的次数算出来 ...

  6. android 学习视频汇总

    1.java基础知识 http://www.eoeandroid.com/thread-333511-1-1.html 网易公开课-抽象编程:http://open.163.com/special/o ...

  7. 菜鸟教程之工具使用(二)——Maven打包非规范目录结构的Web项目

    用过Maven的人都知道,Maven项目的目录结构跟传统的DynamicWeb项目有些不同.当然我们按照Maven的规范建项目最好,但是当你恰好没有按照Maven的规范来,又恰好需要使用Maven来打 ...

  8. Flink SQL与 SQL Parser ,calcite

    http://vinoyang.com/2017/06/12/flink-table-sql-source/ Flink Table&Sql 如何结合Apache Calcite http:/ ...

  9. Virtual Memory$$memory-mapped-files

    Virtual Memory http://csapp.cs.cmu.edu/2e/ch9-preview.pdf https://howtodoinjava.com/java-7/nio/java- ...

  10. AsyncContext简介

    为了支持异步处理,在Servlet 3.0中,在ServletRequest上提供了startAsync()方法: AsyncContext startAsync() throws Java.lang ...