兄弟们,我写了一个应用程序,编译成exe文件,然后我在另一个应用程序中需要调用这个exe,但我在调用前需要判断这个exe程序是否已经在运行,如果已经在运行,我便不让这个exe程序运行了,如果没有运行,便启动这个exe程序,这在C#下面如何做?? 哪位高人指点一二,谢谢

解决方案 »

  1.   

    判断系统中是否存在这个进程,如果存在,则激活,否则则启动up ~up ~up ~up
      

  2.   

    如何得到我机器上所有正在运行的进程?
    http://dotnet.aspx.cc/ShowDetail.aspx?id=58E736CF-02A3-45CD-AE43-35888276017C
    在ASP.NET中杀死进程
    http://dotnet.aspx.cc/ShowDetail.aspx?id=299D1529-59A3-42F9-77A7-7BF353754FEA
      

  3.   

    方法1:
    主要应用System.Diagnostics名字空间中的Process类来实现
    思路,我们在运行程序前,查找进程中是否有同名的进程,同时运行位置也相同,如是没有运行该程序,如果有,就将同名的同位置的程序窗口置前.主要代码:
    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 the other process instance. 
    return process; 



    //No other instance was found, return null. 
    return null; 

    方法2:可以使用互斥体Mutex类型完成此功能。见如下代码:
        [STAThread]
        public static void Main(string[] args) 
        {
             //声明互斥体。
             Mutex mutex = new Mutex(false, "ThisShouldOnlyRunOnce");
             //判断互斥体是否使用中。
             bool Running = !mutex.WaitOne(0, false);
             if (! Running)
                 Application.Run(new FormLogin());
             else
                 MessageBox.Show("应用程序已经启动!");
        }
    看看这个是不是合适
      

  4.   

    参照一个程序只运行一个实例的实现,
    ApplicationStart.cs 文件
    =========================================
    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Runtime.InteropServices;using Zhzuo.WinGui;namespace Zhzuo
    {
    /// <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);
    }
    }
    }
      

  5.   

    在delphi里可以创建一个互斥体对象,这是全局的然后另一个程序运行时就可以判断了
      

  6.   

    感觉还是不行啊,上面的兄弟们提供的方法,好像是一个应用程序自身启动时进行判断,
    我想要这样,假如有两个应用程序a和b,a调用执行b,在调用之前判断b是否
    已经执行,如果执行,则不判断,如果没有执行,则调用执行b。哪位还有高见?
      

  7.   

    参照一个程序只运行一个实例的实现,
    ApplicationStart.cs 文件
    =========================================
    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Runtime.InteropServices;using Zhzuo.WinGui;namespace Zhzuo
    {
    /// <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);
    }
    }
    }
    参照一个程序只运行一个实例的实现,
    ApplicationStart.cs 文件
    =========================================
    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Runtime.InteropServices;using Zhzuo.WinGui;namespace Zhzuo
    {
    /// <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);
    }
    }
    }