c#设计应用程序单实例运行

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

[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

static SingleInstanceManager manager;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    manager = new SingleInstanceManager(new Form5());
    manager.Run(args);
}

public static void ShowForm(Form Nform, bool closeOldOne = true)
{
    manager.ChangeForm(Nform, closeOldOne);
}

public class SingleInstanceManager : WindowsFormsApplicationBase
{
    ApplicationContext app;

    public SingleInstanceManager(Form mainForm)
    {
        this.IsSingleInstance = true;
        app = new ApplicationContext();
        app.MainForm = mainForm;
    }

    protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
    {
        Application.Run(app);
        return false;
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
    {
        base.OnStartupNextInstance(eventArgs);
        SetForegroundWindow(app.MainForm.Handle);
        ShowWindow(app.MainForm.Handle, 4);
    }

    public void ChangeForm(Form newForm, bool closeOldOne = true)
    {
        if (app.MainForm == newForm) return;
        Form tem = app.MainForm;
        tem.Hide();
        app.MainForm = newForm;
        newForm.Show();
        if (closeOldOne) tem.Close();
    }
}

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

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

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

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

时间: 2024-10-04 18:01:46

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

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

简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫描进程列表比对进程名来检测,第二种方法是通过枚举程序窗口的方式,第三种方法是采用共享全局变量来实现,第四种方法是通过创建互斥体来实现. 那么在这些方法中,第一种和第二种方法是有缺陷的,扫描进程列表比对进程名容易对相同进程名字的不同程序产生误报,枚举窗口不适用于无窗口程序且与扫描进程列表的方法也有相同

linux保证程序单实例运行

static int proc_detect(const char *procname){ char filename[100] = {0}; sprintf(filename, "%s/%s.pid", LOG_DIR, procname); int fd = open(filename, O_RDWR | O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)); if (fd < 0) { printf("open fil

PHP实现程序单例运行

原创文章,转载请注明出处:http://huyanping.sinaapp.com/?p=222 作者:Jenner 一.场景描述: 最近我们一块业务,需要不断的监听一个目录的变化,如果目录中有文件,则启动PHP脚本处理掉.最初的方案是使用crontab执行sh脚本,脚本大概如下: SOK=`ps -ef |grep /www/sender.sh | grep -v grep|wc -l` if [[ "$SOK" < "2" ]];then for f in

Inno Setup安装程序单例运行

1.缘起: KV项目下载底层升级包,老是报出升级文件占用问题,反复分析,不得其所. 今天突然发现同时启动多个升级程序实例,分析认为安装包同时被调用多次,导致实例访问文件冲突,导致此问题. 安装程序由Inno Setup制作,遂找其解决方案,最先想到的是互斥体,就由此开始! 2.AppMutex [Setup] AppMutex=MyAppMutex 安装程序Setup段,此互斥变量,会在安装程序启动时检测是否有此互斥体的程序在运行,若有则提示: 通常,在程序中置同名互斥体,此入判断,可避免程序在

让Android程序单例运行

<?xml xxxx?> <manifest xxxxxxx>     <application android:icon="@drawable/icon"           android:label="@string/app_name"         android:launchMode="singleInstance">     <activity android:name=".Mai

Python实例浅谈之五Python守护进程和脚本单例运行

一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,也可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行. Python有时需要保证只运行一个脚本实例,以避免数据的冲突. 二.Python守护进程 1.函数实现 #!/usr/bin/env python #coding: utf-8

【转】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

MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误

今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc.CFileView等类,一进去就编译运行(就是最初自动生成的项目),编译通过,可运行时直接弹出错误框,有点小懵,,,啥都没做就给我看这个: 图一   错误提示框 后来搜索一查,网上好多类似的错误以及解决方案,几乎都试了个遍,有: 方法(1)-重新生成解决方案,或者将项目文件目录下Debug文件夹删了,重新生成Release版: 方法(2)-可以先声明一个临时的C

单实例应用程序

一.概念:一个程序在系统中只能启动一个实例,这样的程序称为单实例应用程序.例如Windows下的任务管理器.回收站.播放器.文件系统等等. 二.实现思想与方法: (1)核心思想:在当前系统中,只需要有能表示程序是否启动的标志,那么就可以利用它来实现单实例应用程序. (2)具体步骤:每当程序启动的时候,都需要先检测这个启动标志,当标志指示已经有实例存在,则当前程序退出,否则运行业务. (3)实现单实例应用程序的方法:共享内存.绑定端口.命名管道.文件锁等等. 三.实现案例:运用文件锁实现 代码转载