这个问题有多人问过,网上也有许多方法
1、用窗口标题来区别:也许他人的程序也碰巧用同样的标题
2、遍历进程:用进程名类区分。缺点:可能有相同的进程名;程序被改名后将有不同的进程名
3、利用全局原子Atom:在启动程序时注册全局原子,在关闭程序时删除全局原子。但是如果进程被强行结束 就不会删除全局原子
4、利用互斥变量Mutex:与全局原子相同,在强行结束进程时无法删除Mutex以上都不能真正的“让程序只运行一个实例”,那位朋友有更好的方法!需考虑 程序被改名、被复制到其它目录、被强行结束.....

解决方案 »

  1.   

    用进程名判断吧,重名的几率很小,只是在理论上存在。
    强行结束进程那就比较正常,所以尽量不使用全局原子Atom,Mutex。
      

  2.   

    本来在.Net CLR规范中,可以直接设置程序集的运行限制...不过.Net Framework不遵守这个规范...-_-bb 微软自己的规范微软不支持...
      

  3.   

    http://blog.csdn.net/knight94/archive/2006/03/16/625809.aspx
      

  4.   

    代码里写一个Struct,然后得到进程后分析有没有该Struct就可以知道了。
      

  5.   

    能不能读取文件的“源文件名”,就是在查看文件属性时的“源文件名”、“内部名称”等
    我发现改变了文件名也不会改变这些东西!就是不知道怎样读取------------
    可以使用MS的DSOFile这个组件来读取和修改
      

  6.   

    相同进程名, 但安装目录不同. 还是可以判断.
    另楼主说的'在强行结束进程时无法删除Mutex'什么意思.
      

  7.   

    参照一下EM的源码,只启动一个进程
    http://www.easymessenger.cn
      

  8.   

    相同进程名, 但安装目录不同. 还是可以判断.
    另楼主说的'在强行结束进程时无法删除Mutex'什么意思.
    --------------------------------------------------------------
    用进程名的方法限制了我的程序不能改名。
    在程序启动时判断 Mutex 是否被我注册,如果 没有注册 则继续运行,如果注册了 则退出程序
    在退出程序时注销 Mutex,
    如果被结束了进程,则无法执行注销Mutex的代码,再次启动程序时导致判断不正确
      

  9.   

    参照一下EM的源码,只启动一个进程
    http://www.easymessenger.cn
    -----------------------------------------------
    看过了,改名后一样可以运行多个实例!
      

  10.   

    进程名判断是在程序启动的时候, 改名没关系.
                Process current = Process.GetCurrentProcess();
                Console.WriteLine(current.ProcessName);
                Console.ReadLine();如果退出程序,则Mutex被自动销毁, 怎么还会有?
      

  11.   

    一个实例已运行,则该实例的Mutex存在
    运行一个新实例, 再创建同名Mutex的时候, 因为已经有了, 所以返回,
    则退出这个新实例, 所创建的Mutex也被销毁,而前面实例和相应的Mutex
    都还在, 会有什么问题吗
      

  12.   

    to:scow(怡红快绿) 
    进程名就是程序的文件名在不同文件加中的两个同名的程序会有相同的进程名。Mutex是有自己来管理的,启动程序时注册,注销也同样由自己的代码完成,如果被意外结束了就不能执行注销的代码!比如你在Closed中注销Mutex,但用户通过任务管理器结束进程时是不会执行Closed事件的,你无法捕获结束进程事件,那你怎样注销Mutex
      

  13.   

    强行结束进程,我使用Mutex,一点问题都没有。不知道楼主是怎么搞的呢?
      

  14.   

    运行前做 crc 校验
    不过比较麻烦而已
      

  15.   

    http://blog.csdn.net/zhzuo/archive/2006/07/04/874745.aspx
      

  16.   

    奇怪了,我以前用Mutex执行效果同Atom,现在试怎么又可以了
    谢谢大家给我的帮助!!!
      

  17.   

    我的程序在强行关闭后MUTEX自动销毁啊。
      

  18.   

    使用mutex,其它的方法都有卸点。把这个mutex的名字稍微取长一点,关于进程被杀掉会造成资源泄漏的问题是不存在的,原因产mutex是内核变量,在windows里,这个变量生命周期会创建的进程绑定在一起,如果创建进程死了,对应的内核级的东西由操作系统释放。这些内核级变量很多,如:Event,Handle等
      

  19.   

    UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0
    微软官方的做法
      

  20.   

    http://www.ggggdiu.com/
    该网页下的C++C#分类中有一个实例可以使用.
      

  21.   

    用hMutex 没有问题啊,假设第一次运行创建了互斥对象CLAPP,第二次再运行就会出现CLAPP正在运行,这时用任务管理器强行杀掉那个??杀一次运行的CLAPP,当然没问题,下次当然还可以用,因为实例;杀掉第二个的话根本没有意义,,楼主到底是什么意思?????不解,我用hMutex就很好,如果楼主实在不放心想完美就记录PID好了