博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF:如何实现单实例的应用程序(Single Instance)
阅读量:5065 次
发布时间:2019-06-12

本文共 3479 字,大约阅读时间需要 11 分钟。

 

先来看第一种最简单粗暴的做法:

检测进程名,如果名称一样,则表示程序已经启动了,就不再启动.

protected override void OnStartup(StartupEventArgs e)    {        // Get Reference to the current Process        Process thisProc = Process.GetCurrentProcess();        // Check how many total processes have the same name as the current one        if (Process.GetProcessesByName(thisProc.ProcessName).Length > 1)        {            // If ther is more than one, than it is already running.            MessageBox.Show("Application is already running.");            Application.Current.Shutdown();            return;        }        base.OnStartup(e);    }很简单,不是吗?但简单有什么错呢? 它很实用.
[注意]这个代码如果在visual studio中调试则无效,因为visual studio调试用的进程是加了一个vshost的后缀的。
 
第二种方案我觉得应该还是可以用mutex来实现嘛,看看下面的代码
using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Linq;using System.Windows;using System.Diagnostics;using System.Threading;namespace WpfApplication1{    ///     /// App.xaml 的交互逻辑    ///     public partial class App : Application    {        protected override void OnStartup(StartupEventArgs e)        {            bool createNew;            Mutex mutex = new Mutex(true, "MyApplication", out createNew);            if (createNew)                base.OnStartup(e);            else            {                MessageBox.Show("程序已经启动了");                Application.Current.Shutdown();            }         }    }}

这一种做法的结果与第一种很类似,或者说没有任何区别。

 

看起来解决问题了,但仍然不是很理想的。最好的情况是,当用户开启第二个实例的时候,如果第一个实例没有处于活动状态,则应该激活它。

我们很自然还是联想到了原先在Windows Forms时代的WindowsFormsApplicationBase,那里面做这个事情太简单了。

首先,添加Microsoft.VisualBasic的引用

namespace WpfApplication1{    public class EntryPoint    {        [STAThread]        public static void Main(string[] args)        {            SingleInstanceManager manager = new SingleInstanceManager();            manager.Run(args);        }    }    // Using VB bits to detect single instances and process accordingly:    //  * OnStartup is fired when the first instance loads    //  * OnStartupNextInstance is fired when the application is re-run again    //    NOTE: it is redirected to this instance thanks to IsSingleInstance    public class SingleInstanceManager : WindowsFormsApplicationBase    {        SingleInstanceApplication app;        public SingleInstanceManager()        {            this.IsSingleInstance = true;        }        protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)        {            // First time app is launched            app = new SingleInstanceApplication();            app.Run();            return false;        }        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)        {            // Subsequent launches            base.OnStartupNextInstance(eventArgs);            app.Activate();        }    }    public class SingleInstanceApplication : Application    {        protected override void OnStartup(System.Windows.StartupEventArgs e)        {            base.OnStartup(e);            // Create and show the application's main window            //MainWindow window = new MainWindow();            Window1 window = new Window1();            window.Show();        }        public void Activate()        {            // Reactivate application's main window            this.MainWindow.Show();            this.MainWindow.Activate();        }    }} 转:http://www.cnblogs.com/chenxizhang/archive/2010/03/25/1694605.html

转载于:https://www.cnblogs.com/jun-jie/p/3676767.html

你可能感兴趣的文章
JAVA WEB开发环境搭建教程
查看>>
jquery 表单校验
查看>>
【机器学习实战】Machine Learning in Action 代码 视频 项目案例
查看>>
我的第一个.NET Core App Windows系统
查看>>
faceswap深度学习AI实现视频换脸详解
查看>>
Android实例-手机安全卫士(十一)-自定义对话框点击事件处理
查看>>
上海行政区域规划图
查看>>
HDU-4417 Super Mario
查看>>
ptmalloc内存分配释放
查看>>
通过Url网络编程实现下载
查看>>
@RequestParam 绑定List参数
查看>>
poj 2195Going Home
查看>>
伪元素消除浮动
查看>>
HttpClient的几个实现类
查看>>
关于对接保税仓物流系统或支付系统推送报关单的一些琐碎的问题
查看>>
mysql将一个库中表的某几个字段插入到另一个库中的表
查看>>
mysql 索引长度tips innodb和myisam引擎
查看>>
[转]Spark能否取代Hadoop?
查看>>
Stack Pointer Tracker
查看>>
IIC原理及简单流程
查看>>