保证C#程序只运行一次

来源:互联网 发布:js split 多个字符 编辑:程序博客网 时间:2024/06/06 10:56
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Windows.Forms;  
  4.   
  5. using System.Runtime.InteropServices;  
  6. using System.Diagnostics;  
  7. using System.Reflection;  
  8.   
  9. namespace 程序只能运行一次  
  10. {  
  11.     static class Program  
  12.     {  
  13.         /// <summary>   
  14.         /// 该函数设置由不同线程产生的窗口的显示状态。   
  15.         /// </summary>   
  16.         /// <param name="hWnd">窗口句柄</param>   
  17.         /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>   
  18.         /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>   
  19.         [DllImport("User32.dll")]  
  20.         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);  
  21.         /// <summary>   
  22.         /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。   
  23.         /// </summary>   
  24.         /// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>   
  25.         /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>   
  26.         [DllImport("User32.dll")]  
  27.         private static extern bool SetForegroundWindow(IntPtr hWnd);  
  28.         private const int WS_SHOWNORMAL = 1;  
  29.   
  30.          
  31.   
  32.   
  33.         /// <summary>  
  34.         /// 应用程序的主入口点。  
  35.         /// </summary>  
  36.         [STAThread]  
  37.         static void Main()  
  38.         {  
  39.             Application.EnableVisualStyles();  
  40.             Application.SetCompatibleTextRenderingDefault(false);  
  41.             Process instance = RunningInstance();  
  42.             if (instance == null)  
  43.             {  
  44.                 Form1 frm = new Form1();  
  45.                 Application.Run(new Form1());  
  46.             }  
  47.             else  
  48.             {  
  49.                 HandleRunningInstance(instance);  
  50.             }   
  51.   
  52.         }  
  53.         public static Process RunningInstance()  
  54.         {  
  55.             Process current = Process.GetCurrentProcess();  
  56.             Process[] processes = Process.GetProcessesByName(current.ProcessName);  
  57.             foreach (Process process in processes)  
  58.             {  
  59.                 if (process.Id != current.Id)  
  60.                 {  
  61.                     if (Assembly.GetExecutingAssembly().Location.Replace("/""//") == current.MainModule.FileName)  
  62.                     {  
  63.                         return process;  
  64.                     }  
  65.                 }  
  66.             }  
  67.             return null;  
  68.         }  
  69.   
  70.         /// <summary>   
  71.         /// 显示已运行的程序。   
  72.         /// </summary>   
  73.         public static void HandleRunningInstance(Process instance)  
  74.         {  
  75.             ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //显示,可以注释掉   
  76.             SetForegroundWindow(instance.MainWindowHandle);            //放到前端   
  77.         }   
  78.   
  79.   
  80.     }  

0 0
原创粉丝点击