例如:浏览器可以打开多个窗口,但是音乐播放器类的应用只能打开一个窗口,如果程序已经运行了,再次运行会重新激活已打开的程序?这个技术有专业的名称吗?怎么实现?
------解决思路----------------------
应该叫只允许运行程序的一个实例。
参考:
What is the correct way to create a single instance application?
http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application
------解决思路----------------------
可以用.Net 提供的具名Mutex实现
------解决思路----------------------
bool runone;
System.Threading.Mutex run = new System.Threading.Mutex(true, "你的进程名称", out runone);
if (runone)
{
run.ReleaseMutex();
Application.EnableVisualStyles();//系统自带
Application.SetCompatibleTextRenderingDefault(false);//系统自带
Application.Run(new MainForm());//系统自带
}
else
{
MessageBox.Show("此软件已经运行,请勿重复打开!", "出错了!", MessageBoxButtons.OK, MessageBoxIcon.Warning);//这里也可以是找到已经存在的进程并将窗体激活等操作
}
------解决思路----------------------
唯一实例这个,最简单的就是进程名,不过这个文件改个名字就没用了。
好一点的就是上面提到的系统提供的命名的 Mutex。名称自己定义,可以长一点避免冲突。不过用起来还有些问题需要考量,比如如果程序异常终止,Mutex没有释放怎么办。
重新激活存在的实例,可以广播一个自定义消息,自己的程序收到这个消息的时候把自己显示出来。
我用过这个方案:http://sanity-free.org/143/csharp_dotnet_single_instance_application.html,也是1楼给的那里面引用的。不过还是需要做一些修改:
考虑异常终止,这个需要在WaitOne 时catch一个AbandonedMutexException异常,表示之前的实例异常终止了,这时程序需要正常运行。
还有,如果程序使用了 Application.Restart,可能在第一个实例完全停止前开启新的实例。原来的实例可能还没有释放mutex,但是此时新的实例需要正常运行,所以WaitOne的时候最好设置一个超时时间,比如1s,给之前的实例释放的时间。