当运行的程序是要占用端口的程序,若打开多个实例,则会出现不可以用的情况,原因是程序是要独占的方式使用端口。避免运行多个实例的办法,就是只运行一个实例。通过代码如何控制勒?请看下面:
/********************************************************************************
版权所有 : Copyright (C) 2009-2012
文件名称 : InstanceProgram
作者名称 :IT面包
邮箱地址 : itbread@hotmail.com
创建时间 : 2012/7/10 14:56:29
网站地址 :http://www.cnblogs.com/ITBread/
*********************************************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;
namespace KeyGen {
public class InstanceProgram {
#region 日让程序只运行一个实例
/// <summary>
/// 要运行的主窗体
/// </summary>
/// <param name="fm"></param>
public static void RunProgram(Form fm) {
Process instance = InstanceProgram.RunningInstance();
if(instance == null)
Application.Run(fm);
else
HandleRunningInstance(instance);
}
public static Process RunningInstance() {
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//遍历与当前进程名称相同的进程列表
foreach(Process process in processes)
{
//如果实例已经存在则忽略当前进程
if(process.Id != current.Id)
{
//保证要打开的进程同已经存在的进程来自同一文件路径
if(Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
//返回已经存在的进程
return process;
}
}
return null;
}
public static void HandleRunningInstance(Process instance) {
ShowWindowAsync(instance.MainWindowHandle, 1); //调用api函数,正常显示窗口
SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
}
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
#endregion
}
}
调用方法就是在Main函数里面将要运行的Form传入给RunProgram方法即可
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
InstanceProgram.RunProgram(new Form1());
}