wpf 单列表_WPF 单实例应用程序

namespace你的命名空间

{

publicclassStartup

{

[STAThread]

publicstaticvoidMain(string[] args)

{

SingleInstanceApplicationWrapper wrapper = newSingleInstanceApplicationWrapper();

wrapper.Run(args);

}

}

publicclassSingleInstanceApplicationWrapper :

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase

{

privateApp app;// 这才是真正的WPF Application

publicSingleInstanceApplicationWrapper()

{

this.IsSingleInstance =true;

}

// 第一次打开调这个方法

protectedoverrideboolOnStartup(

Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)

{

app = newApp();

app.Run();

returnfalse;

}

// 再次打开调这个方法

protectedoverridevoidOnStartupNextInstance(

Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs e)

{

// 当用户试图再次打开这个程序的时候

MessageBox.Show("您正在运行该程序");

}

}

/// 

/// Interaction logic for App.xaml

/// 

publicpartialclassApp : Application

{

}

}

注意:

你刚开始建的项目类型可能是WPF,在项目的属性里,application标签下有个Startup Object,一开始默认应该是“你的namespace.App”,除此之外就只有Not Set了,没别的可选。是因为Main函数才是程序的入口,VS会根据Main函数去搜寻哪些可以作为Startup Object。但我们查看App这个类的代码会发现,默认情况下里面并没有Main函数,这是怎么回事呢?原来VS在编译时会结合xaml自动把代码补充完整。xaml里面的x:Class="你的namespace.App”,其中"你的namespace.App”会作为可选的Startup Object出现。当在别的类里面新加入了Main函数,就会把这个类也列在Startup Object的可选列表中(有时候可能要重启VS才能在Startup Object里看到新的项)。 针对上面的例子(文件名是Startup.cs)则把“命名空间.Startup”作为Startup Object.

总结

以上实现的是真正的single instance,而不是仅仅通过查找有没有相同的进程名来查看程序是否已经启动。用查看相同进程名的方法实现single instance很不可靠。设想:如果有一个恶意程序,每秒查看一下所有的进程,看其中是否有a.exe(假如这恰好是你的程序名)如果没有,则启动一个a.exe,这个a.exe哪怕什么都不干,就为了在哪里占用这个进程名。那么你如果用查看相同进程名来实现single instance的话,除非在一秒钟之内杀死a.exe进程并启动你自己的a.exe,否则可能永远都启动不了你自己的a.exe。当然了,如果这个恶意程序执行的是:定期查看有没有这个进程,如果有则立即杀死,那就更麻烦了。

转自博客园:http://www.cnblogs.com/dc10101/archive/2009/11/24/1609146.html#top

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值