让你的程序只运行一个实例
当运行的程序是要占用端口的程序,若打开多个实例,则会出现不可以用的情况,原因是程序是要独占的方式使用端口。避免运行多个实例的办法,就是只运行一个实例。通过代码如何控制勒?请看下面:
/******************************************************************************** 版权所有 : 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()); }