经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行。所以只限于用在单用户环境,还是不太完美。
- class Program
- {
- [STAThread]
- static void Main(string[] args)
- {
- //防止程序多次运行
- if (!OneInstance.IsFirst("MyTest"))
- {
- Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!");
- return;
- }
- Console.WriteLine("正在运行中");
- Console.ReadLine();
- }
- }
- public static class OneInstance
- {
- ///<summary>
- ///判断程序是否正在运行
- ///</summary>
- ///<param name="appId">程序名称</param>
- ///<returns>如果程序是第一次运行返回True,否则返回False</returns>
- public static bool IsFirst(string appId)
- {
- bool ret = false;
- if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
- {
- CreateMutex(IntPtr.Zero, 0, appId);
- ret = true;
- }
- return ret;
- }
- [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
- private static extern IntPtr OpenMutex(
- uint dwDesiredAccess, // access
- int bInheritHandle, // inheritance option
- string lpName // object name
- );
- [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
- private static extern IntPtr CreateMutex(
- IntPtr lpMutexAttributes, // SD
- int bInitialOwner, // initial owner
- string lpName // object name
- );
- }