本文介绍常见的实现主应用程序单一实例运行的几种方式。

方式一:

    public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
Process thisProc = Process.GetCurrentProcess(); if (Process.GetProcessesByName(thisProc.ProcessName).Length > 1)
{
Application.Current.Shutdown();
return;
}
base.OnStartup(e);
}
}

  

方式二:

    public partial class App : Application
{
public static EventWaitHandle ProgramStarted;
private bool CreatedNew; protected override void OnStartup(StartupEventArgs e)
{
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, "MyApplication", out CreatedNew);
if (CreatedNew)
{
MainWindow mainWindow = new MainWindow();
this.MainWindow = mainWindow;
mainWindow.Show();
}
else
{
ProgramStarted.Set();
Environment.Exit(0);
}
}
}

 

方式三:

    public partial class App : Application
{
private bool canCreateNew;
private int EXISTINGWINGDOW_HANDLER;
private Mutex m_ServerMutex; protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
this.m_ServerMutex = new Mutex(true, "MyApplication", out this.canCreateNew);
if (!this.canCreateNew)
{
try
{
this.EXISTINGWINGDOW_HANDLER = SendMessageHelper.FindWindow(null, "WpfApplication1");
SendMessageHelper.SendMessage(this.EXISTINGWINGDOW_HANDLER, 0x112, 0xf120, 0);
Application.Current.Shutdown(-1);
}
catch
{
}
}
}
} public static class SendMessageHelper
{
[DllImport("User32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll")]
public static extern int SendMessage(int hWnd, int Msg, int wParam);
[DllImport("User32.dll")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
[DllImport("User32.dll")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, IntPtr lParam);
}

  

方式四:

注意:添加 Microsoft.VisualBasic.dll类库引用,并在项目属性窗口中设置启动对象为类MainEntry。

    public partial class App : Application
{ } public class MainEntry
{
[STAThread]
static void Main(string[] args)
{
SingleInstanceManager manager = new SingleInstanceManager();
manager.Run(args);
}
} public class SingleInstanceManager : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
App app; public SingleInstanceManager()
{
this.IsSingleInstance = true;
} //应用程序初次运行时
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
{
try
{
app = new App();
app.InitializeComponent();
app.Run();
}
catch (Exception ex)
{ }
return false;
} //启动下一个应用程序实例时触发
protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
{
base.OnStartupNextInstance(eventArgs);
}
}

  

   对于单一实例运行,不得不提到主进程通知,就是说第二次启动应用程序时,如何发送消息?发送消息的方式有命令行方式和关联文件打开。如在cmd中输入 MyApplocation.exe somaParameters或者打开程序支持的文件(.myextension)。将在后续博客中进行归纳总结......

WPF:实现主应用程序单一实例运行方式总结的更多相关文章

  1. 程序单一实例实现 z

    不少应用程序有单一实例的需求,也就是同时只能开启一个实例(一般也就是一个进程). 实现的方式可能有判断进程名字,使用特殊文件等等,但是最靠谱的方式还是使用系统提供的 Mutex 工具. Mutex是互 ...

  2. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  3. 计算机必知必会:进程process与线程thread 进程定义为一个正在运行的程序的实例

    http://www.nowamagic.net/librarys/veda/detail/1741进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如 ...

  4. WPF中的多进程(Threading)处理实例(二)

    原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...

  5. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  6. windows应用程序单实例

    前言 这才第几天博客就跟不上了,看来一天一篇博客的目标还是有点大,写博客还是挺费时间的,写了不满意删,删完再写...直到自己没了耐心.今天先写个前言,实质性的内容明天再补吧.今天一天的收获还是挺多的, ...

  7. WCF/WPF公司内部订餐程序开发

    WCF/WPF公司内部订餐程序开发 (服务端篇) 上班的第一天,群里讨论关于订餐的问题,所以想到了要不要自己开发一个公司内部的订餐系统呢?方便公司内部员工的订餐,有了想法就简单的实践了下 . 实现还是 ...

  8. 微信小程序web-view实例

    微信小程序web-view实例 index.js //index.js //获取应用实例 const app = getApp() Page({ /** * 页面的初始数据 */ data: { }, ...

  9. asp.net mvc 学习笔记 - 单一实例设计模式

    学习之前,先喊一下口号:每天进步一点,生活更好一点 首先声明一点,我也是新新新手一枚,崭新的新哦.如果文章有不合理的地方,也请各位博友多多指点,不要乱喷哦 我的文采很低调,低调到语文老师对我的期望是你 ...

随机推荐

  1. 在ubuntu 部署svn服务器

    (1)安装svn sudo apt-get install subversion (2)新建一个仓库 mkdir /svn/test chmod 777 /svn/test sudo svnadmin ...

  2. SQL的内连接与外连接

    转自:http://blog.csdn.net/killerggf/article/details/6216102 有两个表A和表B.  表A结构如下:  Aid:int:标识种子,主键,自增ID   ...

  3. oracle中的instr()

    INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置.只检索一次,就是说从字符的开始 到字符的结尾就结束. ...

  4. 公用的stringUtil工具

    (function(){ var ISCHINESE = /[\u4e00-\u9fa5]/; var getData = function( value , maxLenth , isStrick ...

  5. ubuntn14.04 32位安装hadoop2.7.2

    1. 创建用户一枚, sudo addgroup hadoop sudo adduser -ingroup hadoop hadoop_lcc 2. 为新创建的用户添加sudo权限 sudo gedi ...

  6. 【转载】从 LinkedIn 的数据处理机制学习数据架构

    http://www.36dsj.com/archives/40584 译者:伯乐在线-塔塔 网址:http://blog.jobbole.com/69344/ LinkedIn是当今最流行的专业社交 ...

  7. 正确理解SQL Server的许可证(转)

    今天在论坛上看到有人讨论如果使用SQL Server作为SEPM的后台数据库,需要多少个CAL的问题:   If I do have to use SQL Server what type of li ...

  8. JavaScript之点击文字放大

    function box(){ document.getElementById("click").style.WebkitTransform="scale(1.2)&qu ...

  9. hexo资源--theme等

    Hexo (https://github.com/hexojs/hexo) [3]hexo你的博客(http://ibruce.info/2013/11/22/hexo-your-blog/) [4] ...

  10. C#DateTime的用法

    本文较详细地介绍了C#的DateTime对象的使用方法.DateTime.Now.ToShortTimeString() DateTime dt = DateTime.Now; dt.ToString ...