WPF:实现主应用程序单一实例运行方式总结
本文介绍常见的实现主应用程序单一实例运行的几种方式。
方式一:
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:实现主应用程序单一实例运行方式总结的更多相关文章
- 程序单一实例实现 z
不少应用程序有单一实例的需求,也就是同时只能开启一个实例(一般也就是一个进程). 实现的方式可能有判断进程名字,使用特殊文件等等,但是最靠谱的方式还是使用系统提供的 Mutex 工具. Mutex是互 ...
- Qt实现应用程序单实例运行--LocalServer方式
使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...
- 计算机必知必会:进程process与线程thread 进程定义为一个正在运行的程序的实例
http://www.nowamagic.net/librarys/veda/detail/1741进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如 ...
- WPF中的多进程(Threading)处理实例(二)
原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...
- DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法
原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- windows应用程序单实例
前言 这才第几天博客就跟不上了,看来一天一篇博客的目标还是有点大,写博客还是挺费时间的,写了不满意删,删完再写...直到自己没了耐心.今天先写个前言,实质性的内容明天再补吧.今天一天的收获还是挺多的, ...
- WCF/WPF公司内部订餐程序开发
WCF/WPF公司内部订餐程序开发 (服务端篇) 上班的第一天,群里讨论关于订餐的问题,所以想到了要不要自己开发一个公司内部的订餐系统呢?方便公司内部员工的订餐,有了想法就简单的实践了下 . 实现还是 ...
- 微信小程序web-view实例
微信小程序web-view实例 index.js //index.js //获取应用实例 const app = getApp() Page({ /** * 页面的初始数据 */ data: { }, ...
- asp.net mvc 学习笔记 - 单一实例设计模式
学习之前,先喊一下口号:每天进步一点,生活更好一点 首先声明一点,我也是新新新手一枚,崭新的新哦.如果文章有不合理的地方,也请各位博友多多指点,不要乱喷哦 我的文采很低调,低调到语文老师对我的期望是你 ...
随机推荐
- 依赖注入容器Autofac的详解
Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Aut ...
- Python-Networkx
import networkx #建图 G = networkx.Graph() #节点数: len(G) #边数 G.number_of_edges() #节点表 G.nodes() #边表 G.e ...
- VS平台工具集版本
参考:http://blog.csdn.net/hillseas/article/details/47373313 VS从2010之后开始支持使用之前的版本进行编译,可以在工程属性->常规中进行 ...
- Java开发从零开始填坑
开始学习Java,感觉较.NET知识更零碎一些,所以开个帖子把自己踩过的坑记录下来,都是边边角角网上不容易找到的东西. 1.java命令格式:>cd %parent-of-pakadgePath ...
- sql server 中 syscolumns 各个字段的意义
列名 数据类型 描述 name sysname 列名或过程参数的名称. id int 该列所属的表对象 ID,或与该参数关联的存储过程 ID. xtype tinyint systypes 中的物理存 ...
- ANDROID内存优化——大汇总(转)
原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...
- 慎用memset();
<span style="font-family: Arial, Helvetica, sans-serif;">void *(memset) (void *s,int ...
- MVC小例子
[约定胜于配置] 1. 右键Mode数据层添加新建项,用linq连接数据库 (不要在控制层上直接操控linq,要在数据层新建一个类,来对数据库进行操作) 2. 右键Mode数据层添加类,来完成对数据库 ...
- TableViewCell自适应高度
//初始化TableView时设置 self.tv.estimatedRowHeight=54;self.tv.rowHeight=UITableViewAutomaticDimension;
- IOS版应用商店应用源码
app商店 swift版 用swift编写的 应用商店 支持iPad iPhone利用了ios8过渡动画 支持横竖屏操作 源码下载: http://code.662p.com/view/11384.h ...