使用hook,检查有没有同名的进程就可以了,可以看看这个:http://www.codeproject.com/csharp/GlobalSystemHook.asp

解决方案 »

  1.   

    Process curProcess = Process.GetProcessesByName(strProgramName);
    if (curProcess.Length > 1 )
    ...
      

  2.   

    namespace system.dignostics...
    楼上的对阿。
      

  3.   

    public static Process RunningInstance()
    {
    try
    {
    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;
    }
    }
    }
    }
    catch
    {
    // MessageBox.Show ("非法操作,请检查您系统的线程计数器配置!", "警告",MessageBoxButtons.OK, MessageBoxIcon.Warning);
    // Application.Exit();
    return null;
    }
    return null; }
      

  4.   

    Process pro = Process.GetProcessesByName(strProgramName);
    if ( pro.Responding )
    { //不启动服务// }
      

  5.   

    用API中FINDWONDOWS
    [DllImport("user32.dll", EntryPoint="FindWindow")]
    public static extern int FindWindow (
    string lpClassName,
    string lpWindowName
    );
    lpClassName ----  String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类  lpWindowName ---  String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
      

  6.   

    用 liulxmooo(娃娃) 的行
      

  7.   

    一个更简单的方法!
    public static void Main(string[] args) 
        {
             //声明互斥体。
             System.Threading.Mutex mutex = new System.Threading.Mutex(false, "ThisShouldOnlyRunOnce");
             //判断互斥体是否使用中。
             bool Running = !mutex.WaitOne(0, false);
             if (! Running)
                 Application.Run(new FormMain());
             else
                 MessageBox.Show("应用程序已经启动!");
        }
      

  8.   

    ApplicationStart.cs 文件
    =========================================
    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Runtime.InteropServices;using ZZ.WinGui;namespace ZZ
    {
    /// <summary>
    /// AppStart 的摘要说明。
    /// </summary>
    public class ApplicationStart
    {
    private const int WS_SHOWNORMAL = 1;
    [DllImport("User32.dll")]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    [DllImport("User32.dll")] 
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Process instance = GetRunningInstance();
    if(instance == null)
    {
    //初始化程序配置信息
    //ApplicationSettings.Initialize();
    Application.Run(new MainForm());
    }
    else
    {
    HandleRunningInstance(instance);
    }
    }
    /// <summary>
    /// 获取应用程序的实例,没有其它的例程,返回Null
    /// </summary>
    /// <returns></returns>
    public static Process GetRunningInstance()
    {
    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;
    }
    return null;
    }
    /// <summary>
    /// 获取窗口句柄
    /// </summary>
    /// <param name="instance"></param>
    public static void HandleRunningInstance(Process instance)
    {
    //确保窗口没有被最小化或最大化
    ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);
    //设置真实例程为foreground window
    SetForegroundWindow (instance.MainWindowHandle);
    }
    }
    }