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

实现效果

相关推荐
callJJ19 小时前
Spring AI 文本聊天模型完全指南:ChatModel 与 ChatClient
java·大数据·人工智能·spring·spring ai·聊天模型
CBeann19 小时前
企业级规则引擎落地实战:动态脚本引擎 QLExpress ,真香!
java·ai·大模型·规则引擎·qlexpress·大厂实战项目
懈尘19 小时前
从 Java 1.7 到 Java 21:逐版本深入解析新特性与平台演进
java·开发语言
亓才孓19 小时前
[Maven]Maven基础
java·maven
hello 早上好19 小时前
05_Java 类加载过程
java·开发语言
echoVic19 小时前
多模型支持的架构设计:如何集成 10+ AI 模型
java·javascript
橙露19 小时前
Java并发编程进阶:线程池原理、参数配置与死锁避免实战
java·开发语言
echoVic19 小时前
AI Agent 安全权限设计:blade-code 的 5 种权限模式与三级控制
java·javascript
PPPPickup19 小时前
easymall---图片上传以及图片展示
java
历程里程碑19 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法