您可以有很多种的办法,比如在程序中建立一个全局唯一的对象(如命名管道,Mutex等),因为在一个操作系统中这些对象只能有一个,所以只要每次启动程序时检测这个对象,如果存在就说明已经有一个程序的实例在运行,那么当前运行的这个程序就退出。OK??

解决方案 »

  1.   

    public static Process RunningInstance() 

    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 
    //Loop through the running processes in with the same name 
    foreach (Process process in processes) 

    //Ignore the current process 
    if (process.Id != current.Id) 

    //Make sure that the process is running from the exe file. 
    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) 

    //Return the other process instance. 
    return process; 



    //No other instance was found, return null. 
    return null; 
    }
    http://www.c-sharpcorner.com/FAQ/Create1InstanceAppSC.asp
      

  2.   

    static void Main() 
    {
    //防止程序多次运行
    if(!OneInstance.IsFirst("Myclass"))
    {
    MessageBox.Show ("程序已经在运行中!!");
    return;
    } Application.Run(new MainForm());
    }
    不知是不是你要的。
      

  3.   

    to 蓝天白云
    你的方法真好用,谢谢
    to 佳林
    你的方法也好用,只是你忘记给我这个类:#region  *******************  防止程序多次执行  **************************
    public abstract class OneInstance 

    /// <summary> 
    /// 用来判断一个指定的程序是否正在运行 
    /// </summary> 
    /// <param name="appId">程序名称,长一点比较好,防止有重复</param> 
    /// <returns>如果程序是第一次运行返回True,否则返回False</returns> 
    public static bool IsFirst(string appId) 

    bool ret=false; 
    if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero) 

    CreateMutex(IntPtr.Zero,0,appId); 
    ret=true; 

    return ret; 
    }  [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] 
    private static extern IntPtr OpenMutex( 
    uint dwDesiredAccess,  // access 
    int bInheritHandle,    // inheritance option 
    string lpName          // object name 
    );  [DllImport("Kernel32.dll",CharSet=CharSet.Auto)] 
    private static extern IntPtr CreateMutex( 
    IntPtr lpMutexAttributes,  // SD 
    int bInitialOwner,                       // initial owner 
    string lpName                            // object name 
    ); 
    } #endregion另外还有疑问,如果发现已经有一个实例运行了,怎么使用csharp控制这个实例,把它的窗口最大化?
    急用。
      

  4.   

    如何让应用程序只有一个实例在运行?  
    作者: 孟宪会 出自: 【孟宪会之精彩世界】 发布日期: 2003-6-16 8:29:21
    --------------------------------------------------------------------------------
     
    MyForm.csusing System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.Reflection;public class OneInstnace
    {
      [STAThread]
      public static void Main()
      {
        //得到正在运行的例程
        Process instance = RunningInstance();
        if (instance == null)
        {
          //如果没有其它例程,就新建一个窗体
          Application.Run (new Form());
        }
        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)
          {
            //确保例程从EXE文件运行
            if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==
              current.MainModule.FileName)
            {
              //返回另一个例程实例
              return process;
            }
          }
        }    //没有其它的例程,返回Null
        return null;
      }  public static void HandleRunningInstance(Process instance)
      {
        //确保窗口没有被最小化或最大化
        ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);    //设置真实例程为foreground window
        SetForegroundWindow (instance.MainWindowHandle);
      }  [DllImport("User32.dll")]  private static extern bool ShowWindowAsync(
        IntPtr hWnd, int cmdShow);
      [DllImport("User32.dll")] private static extern bool
        SetForegroundWindow(IntPtr hWnd);
      private const int WS_SHOWNORMAL = 1;

      

  5.   

    http://zpcity.com/arli/commonprj/cls_one_instance_Check.cs
      

  6.   

    atian25(阿天)
    感谢你的全部代码,非常管用,尽管仍然使启动变慢现在结帖。