WPF程序单一实例启动问题
2011-05-01 16:38
302 查看
最近在学着写wpf , 做界面确实会漂亮很多。
前不久用wpf 写了一个自己的便签,想让程序只能启动一个实例
但是发现在传统winform里可以自己写代码实现的东西wpf却有点困难
因为系统自动帮你完成了启动这个功能
如果在Application.Startup事件 加入一个全局变量 如mutex来判断
也是可以的
但是已存在实例与新实例时间将无法进行通信(虽然有时候程序并不需要进行同学你)
后来找到一种比较好的方法
就是用WindowsFormsApplicationBase的windows窗口内置支持(这都源于vb。。)
下面是代码(WindowsFormsApplicationBase在Microsoft.VisualBasic.ApplicationServices命名空间下)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Windows.Controls;
using System.Windows.Shapes;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Note_v_2._0
{
public class WpfApp : System.Windows.Application
{
public MainWindow mainWin;
protected override void OnStartup(System.Windows.StartupEventArgs e)
{
base.OnStartup(e);
mainWin = new MainWindow();
//mainWin.Show();
}
public void show()
{
//if (this.mainWin.WindowState == System.Windows.WindowState.Minimized)
// this.mainWin.WindowState = System.Windows.WindowState.Normal;
//this.mainWin.Activate();
}
}
public class SingleInstanceApplicationWrepper :
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
public SingleInstanceApplicationWrepper()
{
this.IsSingleInstance = true;
}
private WpfApp app;
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
{
app = new WpfApp();
app.Run();
return false;
//return base.OnStartup(eventArgs);
}
protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
{
MessageBox.Show("便签已经打开!");
//base.OnStartupNextInstance(eventArgs);
//app.show();
//if (app.mainWin.WindowState == System.Windows.WindowState.Minimized)
// app.mainWin.WindowState = System.Windows.WindowState.Normal;
//app.mainWin.Activate();
}
}
public class Startup
{
[STAThread]
public static void Main(string[] args)
{
SingleInstanceApplicationWrepper wrapper = new SingleInstanceApplicationWrepper();
wrapper.Run(args);
}
}
}
前不久用wpf 写了一个自己的便签,想让程序只能启动一个实例
但是发现在传统winform里可以自己写代码实现的东西wpf却有点困难
因为系统自动帮你完成了启动这个功能
如果在Application.Startup事件 加入一个全局变量 如mutex来判断
也是可以的
但是已存在实例与新实例时间将无法进行通信(虽然有时候程序并不需要进行同学你)
后来找到一种比较好的方法
就是用WindowsFormsApplicationBase的windows窗口内置支持(这都源于vb。。)
下面是代码(WindowsFormsApplicationBase在Microsoft.VisualBasic.ApplicationServices命名空间下)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Windows.Controls;
using System.Windows.Shapes;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Note_v_2._0
{
public class WpfApp : System.Windows.Application
{
public MainWindow mainWin;
protected override void OnStartup(System.Windows.StartupEventArgs e)
{
base.OnStartup(e);
mainWin = new MainWindow();
//mainWin.Show();
}
public void show()
{
//if (this.mainWin.WindowState == System.Windows.WindowState.Minimized)
// this.mainWin.WindowState = System.Windows.WindowState.Normal;
//this.mainWin.Activate();
}
}
public class SingleInstanceApplicationWrepper :
Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
public SingleInstanceApplicationWrepper()
{
this.IsSingleInstance = true;
}
private WpfApp app;
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
{
app = new WpfApp();
app.Run();
return false;
//return base.OnStartup(eventArgs);
}
protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
{
MessageBox.Show("便签已经打开!");
//base.OnStartupNextInstance(eventArgs);
//app.show();
//if (app.mainWin.WindowState == System.Windows.WindowState.Minimized)
// app.mainWin.WindowState = System.Windows.WindowState.Normal;
//app.mainWin.Activate();
}
}
public class Startup
{
[STAThread]
public static void Main(string[] args)
{
SingleInstanceApplicationWrepper wrapper = new SingleInstanceApplicationWrepper();
wrapper.Run(args);
}
}
}
相关文章推荐
- WPF程序只允许一个启动在MVVMLight框架下找不到资源的问题
- 《Applications=Code+Markup》读书札记(2)——创建一个简单的 WPF 程序的代码结构及关于 Window 实例位置设置问题
- WPF程序只允许一个启动在MVVMLight框架下找不到资源的问题
- JAVA程序启动单一实例妙招
- 解决任务计划程序未启动任务,因为相同任务的实例正在运行的问题
- 禁止一个程序启动多个实例
- 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题
- OEM启动:TNS:无监听程序;到实例代理错误
- 如何解决JDeveloper启动时不能创建jvm实例的问题
- kubernetes集群卸载后docker程序无法启动问题:docker.service启动失败:Unit not found
- devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】
- C#实现程序启动唯一实例的一种方法
- 友善之臂开发板开机启动自定义程序,及触摸屏无效问题
- 问题:C#控制台;结果:C#限制程序只能运行一個实例 (防多开)
- 数据库实例创建好后,用plsql登录居然提示ora-12526监听程序:所有适用例程都处于受限模式的问题
- VS2008调试程序时出现“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”的解决办法
- 应用程序配置不正确,程序无法启动的问题小结
- C#编写的windows程序随系统启动的问题
- 运行ASP.Net 程序无法启动调试问题汇总