WPF:如何实现单实例的应用程序(Single Instance)
2014-04-20 18:05
351 查看
先来看第一种最简单粗暴的做法:
检测进程名,如果名称一样,则表示程序已经启动了,就不再启动.
这一种做法的结果与第一种很类似,或者说没有任何区别。
看起来解决问题了,但仍然不是很理想的。最好的情况是,当用户开启第二个实例的时候,如果第一个实例没有处于活动状态,则应该激活它。
我们很自然还是联想到了原先在WindowsForms时代的WindowsFormsApplicationBase,那里面做这个事情太简单了。
首先,添加Microsoft.VisualBasic的引用
检测进程名,如果名称一样,则表示程序已经启动了,就不再启动.
protectedoverridevoidOnStartup(StartupEventArgse) { //GetReferencetothecurrentProcess ProcessthisProc=Process.GetCurrentProcess(); //Checkhowmanytotalprocesseshavethesamenameasthecurrentone if(Process.GetProcessesByName(thisProc.ProcessName).Length>1) { //Iftherismorethanone,thanitisalreadyrunning. MessageBox.Show("Applicationisalreadyrunning."); Application.Current.Shutdown(); return; } base.OnStartup(e); } 很简单,不是吗?但简单有什么错呢?它很实用.
[注意]这个代码如果在visualstudio中调试则无效,因为visualstudio调试用的进程是加了一个vshost的后缀的。
第二种方案我觉得应该还是可以用mutex来实现嘛,看看下面的代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Configuration;
usingSystem.Data;
usingSystem.Linq;
usingSystem.Windows;
usingSystem.Diagnostics;
usingSystem.Threading;
namespaceWpfApplication1
{
///<summary>
///App.xaml的交互逻辑
///</summary>
publicpartialclassApp:Application
{
protectedoverridevoidOnStartup(StartupEventArgse)
{
boolcreateNew;
Mutexmutex=newMutex(true,"MyApplication",outcreateNew);
if(createNew)
base.OnStartup(e);
else
{
MessageBox.Show("程序已经启动了");
Application.Current.Shutdown();
}
}
}
}
这一种做法的结果与第一种很类似,或者说没有任何区别。
看起来解决问题了,但仍然不是很理想的。最好的情况是,当用户开启第二个实例的时候,如果第一个实例没有处于活动状态,则应该激活它。
我们很自然还是联想到了原先在WindowsForms时代的WindowsFormsApplicationBase,那里面做这个事情太简单了。
首先,添加Microsoft.VisualBasic的引用
namespaceWpfApplication1
{
publicclassEntryPoint
{
[STAThread]
publicstaticvoidMain(string[]args)
{
SingleInstanceManagermanager=newSingleInstanceManager();
manager.Run(args);
}
}
//UsingVBbitstodetectsingleinstancesandprocessaccordingly:
//*OnStartupisfiredwhenthefirstinstanceloads
//*OnStartupNextInstanceisfiredwhentheapplicationisre-runagain
//NOTE:itisredirectedtothisinstancethankstoIsSingleInstance
publicclassSingleInstanceManager:WindowsFormsApplicationBase
{
SingleInstanceApplicationapp;
publicSingleInstanceManager()
{
this.IsSingleInstance=true;
}
protectedoverrideboolOnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgse)
{
//Firsttimeappislaunched
app=newSingleInstanceApplication();
app.Run();
returnfalse;
}
protectedoverridevoidOnStartupNextInstance(StartupNextInstanceEventArgseventArgs)
{
//Subsequentlaunches
base.OnStartupNextInstance(eventArgs);
app.Activate();
}
}
publicclassSingleInstanceApplication:Application
{
protectedoverridevoidOnStartup(System.Windows.StartupEventArgse)
{
base.OnStartup(e);
//Createandshowtheapplication'smainwindow
//MainWindowwindow=newMainWindow();
Window1window=newWindow1();
window.Show();
}
publicvoidActivate()
{
//Reactivateapplication'smainwindow
this.MainWindow.Show();
this.MainWindow.Activate();
}
}
}
转:http://www.cnblogs.com/chenxizhang/archive/2010/03/25/1694605.html
相关文章推荐
- WPF:如何实现单实例的应用程序(Single Instance)
- WPF:如何实现单实例的应用程序(Single Instance)
- WPF:如何实现单实例的应用程序(Single Instance)
- WPF:如何实现单实例的应用程序(Single Instance)
- WPF(四)Application3:如何实现单实例的应用程序(Single Instance)
- WPF学习笔记 - 如何用WPF创建单实例应用程序
- 实现单进程(Single Instance)的.NET WinForm应用程序
- 实现单进程(Single Instance)的.NET WinForm应用程序
- WPF实现单进程实例应用程序(像Word一样可以打开多个文件)
- WPF学习笔记 - 如何用WPF创建单实例应用程序
- C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)
- WPF:实现主应用程序单一实例运行方式总结
- hbase RowFilter如何根据rowkey查询以及实例实现代码
- 如何利用局域网来实现VLAN的实例
- [WPF]如何实现设置UserControl 弹出窗口的Owner属性功能
- Delphi中如何防止运行一个应用程序的多个实例
- C#代码实现,确保windows程序只有一个实例(instance)
- 如何实现Hibernate_Struts 数据库应用程序
- 基于.Net平台应用程序唯一运行实例C#代码实现
- WPF 单实例应用程序