写了一个应用程序,现在的情况是这样,如果这个应用程序已经打开了,我再次打开这个程序就会再次打开第二个,这样很占资源。
我想如何才能让程序在打开的时候不再创建新的应用程序,而是关闭前一个或者就是前一个的基础上重新加载资源使前一个程序成为新打开的应用程序呢?
请高手指教,谢谢啊!

解决方案 »

  1.   

    参考,转成c#代码
    http://www.5ivb.net/Info/83/Info30209/
      

  2.   

    我使用的方式,
    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);
    }
    }
    }