c#程序如何实现单例模式
如题,现在程序是做好了,但可以开多个,怎么限制启动只能开一个!如果有一个再运行了,再开,需要把第一个启动着的从任务栏里还原出来,不要报错或者其他信息,可以做到么?...
如题,现在程序是做好了,但可以开多个,怎么限制启动只能开一个!
如果有一个再运行了,再开,需要把第一个启动着的从任务栏里还原出来,不要报错或者其他信息,可以做到么? 展开
如果有一个再运行了,再开,需要把第一个启动着的从任务栏里还原出来,不要报错或者其他信息,可以做到么? 展开
2013-09-24
展开全部
只要你的程序中Main入口是如下的,则你的程序在运行时,在一个时刻只能有一个程序实例,比如Winamp就是这种,当它在运行时,再又击这个程序,是不会再运行一个实例的.
代码很简单
[STAThread]
static void Main(string[] args)
{
bool isExist;
System.Threading.Mutex mutex=new System.Threading.Mutex(true,"myApp",out isExist);
//这里的myApp是程序的标识,建议换成你的程序的物理路径,这样的话如果在一个操作系统中这个标志不会和其它程序冲突
if(isExist)Environment.Exit(1);//实例已经存在,退出程序
}
代码很简单
[STAThread]
static void Main(string[] args)
{
bool isExist;
System.Threading.Mutex mutex=new System.Threading.Mutex(true,"myApp",out isExist);
//这里的myApp是程序的标识,建议换成你的程序的物理路径,这样的话如果在一个操作系统中这个标志不会和其它程序冲突
if(isExist)Environment.Exit(1);//实例已经存在,退出程序
}
2013-09-24
展开全部
using Microsoft.VisualBasic.ApplicationServices;
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SingleInstanceManager manager = new SingleInstanceManager();//单实例管理器
manager.Run(new string[]{});
//Application.Run(new frmMain()); //屏蔽掉了以前的加载头
}
// Using VB bits to detect single instances and process accordingly:
// * OnStartup is fired when the first instance loads
// * OnStartupNextInstance is fired when the application is re-run again
// NOTE: it is redirected to this instance thanks to IsSingleInstance
public class SingleInstanceManager : WindowsFormsApplicationBase
{
frmMain app;
public SingleInstanceManager()
{
this.IsSingleInstance = true;
}
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
{
// First time app is launched
//app = new SingleInstanceApplication();
//app.Run();
app = new frmMain();//改为自己的程序运行窗体
Application.Run(app);
return false;
}
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
// Subsequent launches
base.OnStartupNextInstance(eventArgs);
app.Activate();
}
}
}
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SingleInstanceManager manager = new SingleInstanceManager();//单实例管理器
manager.Run(new string[]{});
//Application.Run(new frmMain()); //屏蔽掉了以前的加载头
}
// Using VB bits to detect single instances and process accordingly:
// * OnStartup is fired when the first instance loads
// * OnStartupNextInstance is fired when the application is re-run again
// NOTE: it is redirected to this instance thanks to IsSingleInstance
public class SingleInstanceManager : WindowsFormsApplicationBase
{
frmMain app;
public SingleInstanceManager()
{
this.IsSingleInstance = true;
}
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
{
// First time app is launched
//app = new SingleInstanceApplication();
//app.Run();
app = new frmMain();//改为自己的程序运行窗体
Application.Run(app);
return false;
}
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
// Subsequent launches
base.OnStartupNextInstance(eventArgs);
app.Activate();
}
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-24
展开全部
搜索进程名是不行的,比如我把exe copy一份,改个名字,就能起两个了
VB天生支持,所以我变通的通过调用VB的类来实现。
PS:记得引用“Microsoft.VisualBasic”库哦,不然会抱错的。
VB天生支持,所以我变通的通过调用VB的类来实现。
PS:记得引用“Microsoft.VisualBasic”库哦,不然会抱错的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-24
展开全部
这个只要在运行前添加判断语句,搜索内存进程是否有这个程序名,有的话就调出,没有就创建进程运行新程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询