C#只允许启动一个WinFrom进程的两种方法

方法一:只禁止多个进程运行
[STAThread]
public static void Main()
{
    bool ret;
    System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);

    if (ret)
    { 
        System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   
         System.Windows.Forms.Application.DoEvents();
        System.Windows.Forms.Application.Run(new Main());
        //Main为你程序的主窗体,如果是控制台程序不用这句
        mutex.ReleaseMutex();
    }
    else
    { 

        MessageBox.Show(null, @"有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); 
        //提示信息,可以删除。
        Application.Exit();//退出程序
    }
}
 

方法二:禁止多个进程运行,并当重复运行时激活以前的进程
[STAThread]
public static void Main()
{
    //Get   the   running   instance. 
    Process instance = RunningInstance();
    if (instance == null)
    { 
 System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   

        System.Windows.Forms.Application.DoEvents();
        //There  isn't another instance, show our form.   

        Application.Run(new Main());
    }    
    else
    {
        //There is another instance of this process.  
        HandleRunningInstance(instance);
    }
}

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

public static void HandleRunningInstance(Process instance)
{
    //Make sure the window is not minimized or maximized 
    ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
    //Set the real intance to 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;

posted @ 2008-11-02 22:44  天秤水  阅读(572)  评论(0编辑  收藏  举报