软件编程
位置:首页>> 软件编程>> C#编程>> c#防止多次运行代码收集分享

c#防止多次运行代码收集分享

作者:shangke  发布时间:2021-09-27 18:28:26 

标签:c#,防止,多次运行

方法一


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
     );
 }

方法二


string MnName = Process.GetCurrentProcess().MainModule.ModuleName;
//返回不具有扩展名的制定路径字符串的文件名
String Pname = Path.GetFileNameWithoutExtension(MnName);
Process[] myprocess = Process.GetProcessesByName(Pname);
if (myprocess.Length > 1)
{
 MessageBox.Show("yici", "tishi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
 //Application.EnableVisualStyles();
 ////Application.SetCompatibleTextRenderingDefault(false);
 //Application.Run(new Form1());
}

方法三

原文如下(https://www.jb51.net/article/41179.htm)

经常我们会有这样的需求,只让应用程序运行一个实体。通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又 运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一台电脑上一般只能运行一个QQ游戏大厅(不过以前听说过有双开的 * )。

那我们的程序也能像QQ游戏那里禁止多次启动吗,答案是可以的,下面介绍下一个简单的实现方法,那就是Mutex(互斥)。

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多个线程同步访问的一个类。它非常类似了Monitor类,因为他们都只有一个线程能拥有锁定。而操作系统能够识别有名称的互 斥,我们可以给互斥一个唯一的名称,在程序启动之前加一个这样的互斥。这样每次程序启动之前,都会检查这个命名的互斥是否存在。如果存在,应用程序就退 出。


static class Program
 {
   /// <summary>
   /// The main entry point for the application.
   /// </summary>
   [STAThread]
   static void Main()
   {
     bool createdNew;
     //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
     //第二个参数可以设置为产品的名称:Application.ProductName

//每次启动应用程序,都会验证名称为SingletonWinAppMutex的互斥是否存在
     Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);

//如果已运行,则在前端显示
     //createdNew == false,说明程序已运行
     if (!createdNew)
     {
       Process instance = GetExistProcess();
       if (instance != null)
       {
         SetForegroud(instance);
         Application.Exit();
         return;
       }
     }
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new MainForm());
   }

/// <summary>
   /// 查看程序是否已经运行
   /// </summary>
   /// <returns></returns>
   private static Process GetExistProcess()
   {
     Process currentProcess = Process.GetCurrentProcess();
     foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
     {
       if ((process.Id != currentProcess.Id) &&
         (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
       {
         return process;
       }
     }
     return null;
   }

/// <summary>
   /// 使程序前端显示
   /// </summary>
   /// <param name="instance"></param>
   private static void SetForegroud(Process instance)
   {
     IntPtr mainFormHandle = instance.MainWindowHandle;
     if (mainFormHandle != IntPtr.Zero)
     {
       ShowWindowAsync(mainFormHandle, 1);
       SetForegroundWindow(mainFormHandle);
     }
   }

[DllImport("User32.dll")]
   private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("User32.dll")]
   private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
 }

经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行。所以只限于用在单用户环境,还是不太完美。


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
     );
 }
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com