比如:我打开第一个CS文件,会自动启动一个VS来打开这个CS文件,再打开第二个CS文件,系统会自动用已启动的VS来打开这个文件,而不会重新启到一个VS,请问这个是如何实现的??谢谢!!!

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Threading;namespace WindowsApplication35
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                bool vExists;
                Mutex vMutex = new Mutex(false, "WindowsApplication35", out vExists);
                if (!vExists)
                {
                    MessageBox.Show("程序已经启动!");
                    return;
                }
                else
                {
                    vMutex.WaitOne();
                }
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }
      

  2.   

    public bool PrevInstance()
            {
                string procName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
                if (System.Diagnostics.Process.GetProcessesByName(procName).GetUpperBound(0) > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }返回true就是已经运行了
      

  3.   

    很多程序的设置中有“是否允许启动多个实例”的选项(例如UltraEdit)。如果是是,不管系统中是否有实例在运行,都会启动一个新的实例进行操作(例如打开当前文档)。这好像是Windows的默认做法。如果是是,需要在程序中检查是否有实例在运行,如果没有,同上情况。如果有,需要在程序中作处理来进行操作(例如关闭原来的文档和/或打开新的文档)。以上是猜测。回头试试看。
      

  4.   

    zswang(伴水清清)(专家门诊清洁工) ,谢谢!!
    我的意思是如果有这么一个进程就用这个进程来打开文件,说简单一点就是像用VS打开CS文件一样,不管双击多个CS文件,始终只有一个VS程序启动
      

  5.   

    我的做法是在程序里放个timer控件,每1000毫秒读取一下本地的一个xml文件,如果xml的内容改过就根据xml里的内容重新加载。不好意思,方法比较另类。
      

  6.   

    to:alldj(灵山妖姬);
    你的方法倒是可以改进一下,如果有进程在运行,则往xml里面写入双击的文件所在的路径,进程每隔一定时间扫描一下这个xml,然后把文件打开,呵呵,还有更好的方法吗
      

  7.   

    还有种办法,写一个dll,然后在程序里用委托回调使这个dll不停地侦测注册表里的某一个位置,而双击文件的时候通过启动程序把文件和路径写进注册表里。
      

  8.   

    微软的做法多数是先把文件信息加载到内存里,再从内存里和developer挂钩,再去读取。做是能做,就是麻烦。
      

  9.   

    public bool PrevInstance()
            {
                string procName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
                if (System.Diagnostics.Process.GetProcessesByName(procName).GetUpperBound(0) > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }返回true就是已经运行了这个方法就可以了
      

  10.   

    我不是要判断程序是否已经运行,而在在已经运行的情况下如何用这个程序来打开你双击的文件,就像VS已经启起来 了,你再双击一个CS文件的时候会自动用这个VS来打开,而不会再起一个VS来打开这你双击的CS文件!!
      

  11.   

    以上朋友讲了,当双击文件时,如果进程存在,则将文件路径写入XML
    在程序运行过程中,每一时间段扫描一下XML文件,如果存在文件路径,则打开。但是运行效率好像有点低...等待...
      

  12.   

    恩,我也想知道,ms是怎么做的,还有我用的文本编辑软件(EMedit)也是这样的
      

  13.   

    伴水的方法只是解决了检测是否有实例在运行的问题。
    lz的要求还要用已经在运行的实例打开文件。
    可以用System.Diagnostics.Process.GetProcessesByName找到正在运行的进程,进程得到了那么窗口也就有了,然后用SendMessage发出打开文件的消息,当然你的程序要能响应你自己定义的打开文件的消息。
    具体怎么实现就自己找下吧,资料太多了。
      

  14.   

    通过发消息的方法是可以的
    注意如果是发送字符串这样的不定长数据
    需要用WM_COPYDATA消息处理跨进程结构传递