C# 唯一性进程的方法封装(Winform/WPF通用)

C#唯一进程封装

C# 唯一性进程的方法封装

csharp 复制代码
 public class UniqueProcess
 {
      /// <summary>
    /// 焦点切换指定的窗口,并将其带到前台
    /// </summary>
    /// <param name="hWnd"></param>
    /// <param name="fAltTab"></param>
     [DllImport("user32.dll")]
     public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
      
      //提示消息
     public static string Message = "该应用系统已经在运行!";

     /// <summary>
     /// 获取当前程序名已运行的进程,如果没有则返回null
     /// </summary>
     /// <returns></returns>
     public static Process RunningInstance()
     {
         Process current = Process.GetCurrentProcess();
         Process[] processes = Process.GetProcessesByName(current.ProcessName);
         //遍历与当前进程名称相同的进程列表
         foreach (Process process in processes)
         {
             if (process.Id != current.Id)
             {
                 return process;
             }
         }
         return null;
     }

     /// <summary>
     /// 将进程主窗体显示到最前
     /// </summary>
     /// <param name="instance"></param>
     public static void HandleRunningInstance(Process instance)
     {
         MessageBox.Show(Message, "提示信息");
         IntPtr handle = instance.MainWindowHandle;
         //将进程显示在最前
         SwitchToThisWindow(handle, true);
     }
 }

在WPF中使用

csharp 复制代码
 public partial class App : Application
 {
   
     protected override void OnStartup(StartupEventArgs e)
     {
         var instance = UniqueProcess.RunningInstance();
         if (instance != null)
         {
             UniqueProcess.HandleRunningInstance(instance);
             //关闭
             Application.Current.Shutdown();

             return;
         }

         //正常启动
         base.OnStartup(e);
     }
 }

在Winform中使用

csharp 复制代码
internal static class Program
{

    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
        
        var instance = UniqueProcess.RunningInstance();
        if (instance != null)
        {
            UniqueProcess.HandleRunningInstance(instance);
            //未创建窗体,直接返回就退出程序了,无需另外关闭
            return;
        }
        //正常启动
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

实现效果

相关推荐
llwszx1 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野1 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person2 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜3 小时前
java异常学习
java
FrankYoou4 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*4 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了5 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来5 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
weixin_478689765 小时前
十大排序算法汇总
java·算法·排序算法
葬歌倾城5 小时前
JSON的缩进格式方式和紧凑格式方式
c#·json