bool bOnlyOneInstance = false;
Mutex mutex = new Mutex(true, Application.UserAppDataPath.Replace(@"\", "_"), out bOnlyOneInstance) ;
if(bOnlyOneInstance)
{
    Application.Run(new BJClient());
}
else
{
    MessageBox.Show("系统已经运行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) ;
}当编译目录为Debug目录时能防止程序重复运行。为什么当目录为Release不能防止程序重复运行,该如何做?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4593/4593108.xml?temp=.4237024
      

  2.   

    Process[] proc = Process.GetProcessesByName("Server");
    if (proc.Length > 1)
    {
    MessageBox.Show("数据服务器 Server.exe 已经运行", "提示");
    Application.Exit();
    return;
    }
      

  3.   

    using 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;
    }
      

  4.   

    Mutex mutex = new Mutex(false, string.Format("{0}_{1}", Application.StartupPath.Replace('\\', '_'), "你的程序名"));if (!mutex.WaitOne(0, false)) {
    mutex.Close();
    MessageBox.Show("只能一个");
    return;
    }
    放在显示form的前面