C#应用程序只允许运行一个实例,多次运行的时候激活当前实例,显示其界面

  很多时候,我们开发的程序,需要单例运行的的功能,即整个应用程序只允许同时运行最多一个实例,重复运行的时候,激活当前实力,显示其界面。

  在C#程序中,其解决方案有多重,可以参照Charles ChenC#程序只允许运行一个实例的解决方案一文。

  参照其文章,我决定使用调用Windows Api的方法,大致如下:

  

namespace BarCodeSystem
{
    public static class Program
    {
        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public static void Main()
        {
            Process instance = RunningInstance();
            if (instance == null)
            {
                BarCodeSystem.App app = new BarCodeSystem.App();
                app.InitializeComponent();
                app.Run();
            }
            else
            {
                HandleRunningInstance(instance);
            }
        }

        /// <summary>
        /// 获取进程
        /// </summary>
        /// <returns></returns>
        public static Process RunningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);

            foreach (Process process in processes)
            {
                if (process.Id != current.Id)
                {
                    if (process.MainModule.FileName == current.MainModule.FileName)
                    {
                        return process;
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// 处理进程
        /// </summary>
        /// <param name="instance"></param>
        public static void HandleRunningInstance(Process instance)
        {
            MyProcess mp = new MyProcess();
            IntPtr x = mp.GetMainWindowHandle(instance.Id);
            Application.EnableVisualStyles();

            //确保窗体不是最大化或者最小化
            ShowWindowAsync(x, WS_SHOWNORMAL);

            //将实例放置到前台
            SetForegroundWindow(instance.MainWindowHandle);
        }

        ///<summary>
        /// 该函数设置由不同线程产生的窗口的显示状态
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分</param>
        /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零</returns>
        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

        /// <summary>
        ///  该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。
        ///  系统给创建前台窗口的线程分配的权限稍高于其他线程。
        /// </summary>
        /// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>
        /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns>
        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
    }
}

  这里,我自定义了Main函数,当然,也可以在项目中本来的Main函数中添加代码,达到相同的效果。

  关于WPF项目如何自定义Main函数,可以参考这篇文章

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 09:19:30

C#应用程序只允许运行一个实例,多次运行的时候激活当前实例,显示其界面的相关文章

WINCE程序只运行一个,防止多重运行。

在 winform中,程序只运行一个,防止多重运行,很容易.如用FindWindow.Mutex和C#直接Process遍历,都可以实现. 但是,到了WINCE 系统中,要么方法不存在,即使引入CreateMutex,也是白搭.根本无效. 从网上找到一篇通过系统快照方式的方案.不过,大侠们写的都不完整,我特地贡献一个可以直接使用的类: using System.IO; using System.Runtime.InteropServices; //可能还缺其他using,,,,没仔细看. pub

C# WinForm中如何让当前应用程序只允许启动一个实例

我们在WinForm开发中,很多情况下是需要只允许让用户运行一个实例,那么代码其实很简单.只需要修改Program.cs文件,代码如下 static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderin

C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)

防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在前端显示. 主要用到两个API 函数: ShowWindowAsync 该函数设置由不同线程产生的窗口的显示状态. SetForegroundWindow 该函数将创建指定窗口的线程设置到前台,并且激活该窗口.键盘输入转向该窗口,并为用户改各种可视的记号.系统给创建前台窗口的线程分配的权限稍高于其他线程. 代码如下:引用以下命名空间: using Syste

程序员简单打造一个灵活智能的自动化运维系统C#实例程序

你是一个程序员,被派去管理公司500台计算机.这些机器可能需要执行一些自动化任务,一台台手动操作会把你累死.重复性的工作还是交给电脑处理,怎么解决这个问题呢?一个自动化的运维系统是必须的.自己实现的好处是直观,可以掌握运维的每一个环节. 思路 可以在这些电脑上安装一个程序,此程序定期执行一个请求,去我们的中心服务器上获取指令,然后执行这些指令就可以了.这些指令可以是一个脚本文件,但最通用的应该是一个包含指令的压缩包.大体的步骤就是:下载->解压->运行. 实现 客户端开发,C#开发一个wind

C# 实现程序只启动一次(总结)

我前面的三篇文章是从网上找到的(如下链接),都说是实现程序只启动一次的功能. C#防止程序多次运行C#检测程序重复运行的函数(可以在多用户登录情况下检测)C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示) C# 实现程序只启动一次(实现程序自重启) 如果你已经读了前面的几篇文章,我相信你自己或许已经有答案了,我自己用下来感觉还是有一些区别的,现在把我总结的记录下来: 一:使用System.Threading.Mutex类 using (System.Threadin

运行时异常和非运行时异常

RunntimeException的子类: ClassCastException 多态中,可以使用Instanceof 判断,进行规避 ArithmeticException 进行if判断,如果除数为0,进行return NullPointerException 进行if判断,是否为null ArrayIndexOutOfBoundsException 使用数组length属性,避免越界 这些异常时可以通过程序员的良好编程习惯进行避免的 1:遇到运行时异常无需进行处理,直接找到出现问题的代码,进

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

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实

【转】delphi程序只允许运行一个实例的三种方法:

一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' {MainForm}; {$R *.res} var hAppMutex: THandle; //声明互斥变量 begin hAppMutex := CreateMutex(nil, false,’projectname’); //创建互斥对象projectname工程名称 if ( (hAppM

多次单击快捷方式,只运行一个程序实例

在应用程序安装之后,单击一次快捷方式,就运行一个程序实例,对于资源独占型程序来说,这样是不可以的,比如该程序使用了当前系统的某个端口,当同样的程序再次运行,再次试图占用同一个端口次,会提示"端口已经被占用的"异常.如此,必须在启动应用程序时,必须判断该程序是否已经有一个实例在运行.下面这个类中先判断该程序的实例有没有在运行,使用线程同步类EventWaitHandle(Boolean, EventResetMode, String)及注册正在等待 WaitHandle 的委托方法Reg

[VC]在VC++中实现让程序只运行一个实例的方法且实现该实例

方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C++的开发实践中,对于16位的Windows系统,应用程序的hPrevInstance句柄保存了应用程序上一个运行的实例,可以用该值来检查是否 有实例运行:然而在32位Windows系统下,这个值总是NULL,所以无法利用该值来实现程序运行唯一实例.本实例给出了解决这个问题的简单办法,只 要将程序中稍