当前位置: 首页 > 编程笔记 >

C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

马欣德
2023-03-14
本文向大家介绍C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码,包括了C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码的使用技巧和注意事项,需要的朋友参考一下

我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错。

为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实例,而且能实现当程序在运行时,再去双击程序图标,直接呼出已经运行的程序。

下面看代码,只需在程序的入口文件中加如下代码即可:

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 frmMain());
    }
    else
    {
      //1.2 已经有一个实例在运行
      HandleRunningInstance(instance);
    }

    //Application.Run(new frmMain());
  }

  //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)
  {
    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
}
 类似资料:
  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 问题内容: 我需要防止用户多次启动我的Java应用程序(WebStart Swing应用程序)。因此,如果应用程序已经在运行,则应该无法再次启动它或显示警告/再次关闭它。 有一些方便的方法可以做到这一点吗?我考虑过要阻止端口或将某物写入文件。但是希望您可以访问某些系统属性或JVM? 顺便说一句 目标平台是带有Java 1.5的Windows XP 问题答案: 我认为您的建议是在启动应用程序时打开端

  • 问题内容: 有没有一种Python方式可以只运行一个程序实例? 我想出的唯一合理的解决方案是尝试将其作为服务器在某个端口上运行,然后尝试将第二个程序绑定到同一端口-失败。但这不是一个好主意,也许有比这更轻巧的东西了吗? (考虑到程序有时可能会失败,例如segfault-因此“锁定文件”之类的东西将无法工作) 问题答案: 以下代码可以完成此工作,它是跨平台的,并且可以在Python 2.4-3.2上

  • 问题内容: 有没有一种Python方式可以只运行一个程序实例? 我想出的唯一合理的解决方案是尝试将其作为服务器在某个端口上运行,然后尝试将第二个程序绑定到同一端口-失败。但这不是一个好主意,也许有比这更轻巧的东西了吗? (考虑到程序有时可能会失败,例如segfault-因此“锁定文件”之类的东西将无法工作) 问题答案: 以下代码可以完成此工作,它是跨平台的,并且可以在Python 2.4-3.2上

  • 本文向大家介绍C#运行CGI程序实例,包括了C#运行CGI程序实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#运行CGI程序的方法。分享给大家供大家参考。具体实现方法如下: 一、控制面板—>程序和功能—>打开或关闭Windows功能 把相关的功能勾上,点“确定” 二、新建一个网站,配置ISAPI和CGI限制、处理程序映射 三、CGI控制台应用程序代码: 四、Web程序页面代码: 希

  • 问题内容: 我知道在Go中,会将goroutine绑定到一个OS线程,并且不允许其他goroutine在该线程中执行。儿童goroutine也是这样吗? 例如: 这两个goroutine是在单个和排他的OS线程中执行还是仅在第一个线程中执行? 问题答案: 文档的说: LockOSThread 将调用goroutine连接 到其当前的操作系统线程。在调用goroutine退出或调用UnlockOST

  • 我有一个小Java程序。我使用Graal的(即GraalVM AOT又名SubstrateVM)构建了一个二进制文件。 我的程序可以在Java运行时执行,也可以从本机映像二进制文件执行。判断我所处环境的最佳方式是什么? (总的来说,这可能是一种不好的做法,但我相信在某些并不罕见的情况下,这是不可避免的/必要的。)

  • 本文向大家介绍Android实现判断某个服务是否正在运行的方法,包括了Android实现判断某个服务是否正在运行的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现判断某个服务是否正在运行的方法。分享给大家供大家参考,具体如下: 希望本文所述对大家Android程序设计有所帮助。