这个问题有多人问过,网上也有许多方法
1、用窗口标题来区别:也许他人的程序也碰巧用同样的标题
2、遍历进程:用进程名类区分。缺点:可能有相同的进程名;程序被改名后将有不同的进程名
3、利用全局原子Atom:在启动程序时注册全局原子,在关闭程序时删除全局原子。但是如果进程被强行结束 就不会删除全局原子
4、利用互斥变量Mutex:与全局原子相同,在强行结束进程时无法删除Mutex以上都不能真正的“让程序只运行一个实例”,那位朋友有更好的方法!需考虑 程序被改名、被复制到其它目录、被强行结束.....
1、用窗口标题来区别:也许他人的程序也碰巧用同样的标题
2、遍历进程:用进程名类区分。缺点:可能有相同的进程名;程序被改名后将有不同的进程名
3、利用全局原子Atom:在启动程序时注册全局原子,在关闭程序时删除全局原子。但是如果进程被强行结束 就不会删除全局原子
4、利用互斥变量Mutex:与全局原子相同,在强行结束进程时无法删除Mutex以上都不能真正的“让程序只运行一个实例”,那位朋友有更好的方法!需考虑 程序被改名、被复制到其它目录、被强行结束.....
强行结束进程那就比较正常,所以尽量不使用全局原子Atom,Mutex。
我发现改变了文件名也不会改变这些东西!就是不知道怎样读取------------
可以使用MS的DSOFile这个组件来读取和修改
另楼主说的'在强行结束进程时无法删除Mutex'什么意思.
http://www.easymessenger.cn
另楼主说的'在强行结束进程时无法删除Mutex'什么意思.
--------------------------------------------------------------
用进程名的方法限制了我的程序不能改名。
在程序启动时判断 Mutex 是否被我注册,如果 没有注册 则继续运行,如果注册了 则退出程序
在退出程序时注销 Mutex,
如果被结束了进程,则无法执行注销Mutex的代码,再次启动程序时导致判断不正确
http://www.easymessenger.cn
-----------------------------------------------
看过了,改名后一样可以运行多个实例!
Process current = Process.GetCurrentProcess();
Console.WriteLine(current.ProcessName);
Console.ReadLine();如果退出程序,则Mutex被自动销毁, 怎么还会有?
运行一个新实例, 再创建同名Mutex的时候, 因为已经有了, 所以返回,
则退出这个新实例, 所创建的Mutex也被销毁,而前面实例和相应的Mutex
都还在, 会有什么问题吗
进程名就是程序的文件名在不同文件加中的两个同名的程序会有相同的进程名。Mutex是有自己来管理的,启动程序时注册,注销也同样由自己的代码完成,如果被意外结束了就不能执行注销的代码!比如你在Closed中注销Mutex,但用户通过任务管理器结束进程时是不会执行Closed事件的,你无法捕获结束进程事件,那你怎样注销Mutex
不过比较麻烦而已
谢谢大家给我的帮助!!!
微软官方的做法
该网页下的C++C#分类中有一个实例可以使用.