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

实现效果

相关推荐
optimistic_chen5 小时前
【AI Agent 全栈开发】MCP
java·linux·运维·人工智能·ai编程·mcp
2401_8332693012 小时前
Java网络编程入门
java·开发语言
金銀銅鐵12 小时前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
それども13 小时前
Gradle 构建疑难杂症 Could not find netty-transport-native-epoll-linux-aarch_64.ja
java·服务器·gradle·maven
正儿八经的少年13 小时前
application.yml 系列配置文件作用与区别
java·配置文件
鱼很腾apoc14 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
cheems952714 小时前
[Spring MVC] 统一功能与拦截器实践总结
java·spring·mvc
Full Stack Developme15 小时前
Spring Boot 事务管理完整教程
java·数据库·spring boot
城管不管15 小时前
前后端远程协作
java
青云计划15 小时前
Feed流
java·后端·spring