`
hugh-lin
  • 浏览: 70373 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

[转]实现同时只允许运行一个程序实例

 
阅读更多

方法一:

/// <summary>
/// 从这里开始运行
/// </summary>
[STAThread]
static void Main()
{
    Process instance = RunningInstance();
    if (instance == null)
    {
        //没有实例在运行
        WeatherApp appInstance = new WeatherApp();
        appInstance.StartMainGui();
    }
    else
    {
        //已经有一个实例在运行
        HandleRunningInstance(instance);
    }
}
#region 确保只有一个实例
public static Process RunningInstance()
{
    Process current = Process.GetCurrentProcess();
    Process[] processes = Process.GetProcessesByName(current.ProcessName);
    //遍历与当前进程名称相同的进程列表
    foreach (Process process in processes)
    {
        //Ignore the current process
        if (process.Id != current.Id)
        {
            //Make sure that the process is running from the exe file.
            if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
            {
                //Return the other process instance.
                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
 

方法二:

[STAThread]
static void Main(string[] args)
{
    bool isFirst;

    System.Threading.Mutex mutex = new System.Threading.Mutex(true, "WindowAppTest", out isFirst);
    //这里的myApp是程序的标识,建议换成你的程序的物理路径,这样的话如果在一个操作系统中这个标志不会和其它程序冲突
    if (!isFirst)
    {
        MessageBox.Show("Exist");
        Environment.Exit(1);//实例已经存在,退出程序
    }
    else
    {
        Application.Run(new Form1());
    }
}

分享到:
评论

相关推荐

    C#的核心问题-基础问题-如何只保留一个程序运行实例.rar

    一个老生常谈的问题,如何实现不允许同时运行两个程序实例(检测进程是否已经存在),适合广大C#工程师。

    Linux手机平台让应用程序单实例运行

    当应用程序已经在运行, 再次运行该应用程序时,通常只是把该应用程序的窗口提到前面来,把新的命令行参数传递给第一个运行实例,而第二个实例退出。这在传统的单进程多线程的手机 平台中,实现是简单而直接的,而在...

    解决C#程序只允许运行一个实例的几种方法详解

    本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运行。要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现:方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs...

    Linux下QT程序解决单例程序

    本资源包含x86 linux下qt程序解决同时只允许运行一个程序实例的库,头文件和使用方法!

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

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

    C# 禁止应用程序多次启动的实例

    通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一台电脑上一般只能运行一个QQ游戏大厅(不过以前听说过有双开的外挂)。 ...

    VC++常用功能实例

    系统只能允许一个程序运行 7 在状态栏中添加时间 8 研究调用存储过程 8 得到本机的IP地址 9 vc调用chm文件 10 最高窗口的实现 10 防止Edit框中的Password不保密 11 在同一系统中显示GB字符和BIG5字符 12 改变颜色...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例114 封装类实现一个简单的计算器 139 实例115 使用面向对象思想查找字符串中的 所有数字 140 5.3 面向对象技术高级应用 141 实例116 自定义抽象类计算圆形的面积 141 实例117 利用接口实现选择不同的语言 143 ...

    检测是否重复运行易语言源码

    但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥的问题...

    C#程序开发范例宝典(第2版).part08

    实例050 只允许输入数字的TextBox控件 57 实例051 在TextBox控件底端显示下划线 59 实例052 屏蔽TextBox控件上的粘贴功能 61 实例053 屏蔽TextBox控件上默认的右键菜单 62 2.2 ComboBox控件应用 63 实例054 ...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    C#程序开发范例宝典(第2版).part12

    实例050 只允许输入数字的TextBox控件 57 实例051 在TextBox控件底端显示下划线 59 实例052 屏蔽TextBox控件上的粘贴功能 61 实例053 屏蔽TextBox控件上默认的右键菜单 62 2.2 ComboBox控件应用 63 实例054 ...

    C#程序开发范例宝典(第2版).part13

    实例050 只允许输入数字的TextBox控件 57 实例051 在TextBox控件底端显示下划线 59 实例052 屏蔽TextBox控件上的粘贴功能 61 实例053 屏蔽TextBox控件上默认的右键菜单 62 2.2 ComboBox控件应用 63 实例054 ...

Global site tag (gtag.js) - Google Analytics