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

实现效果

相关推荐
geNE GENT1 天前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
FQNmxDG4S1 天前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
heimeiyingwang1 天前
【架构实战】状态机架构:订单/工单状态流转设计
观察者模式·架构·wpf
虹科网络安全1 天前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje1 天前
Java语法进阶
java·开发语言·jvm
rKWP8gKv71 天前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫1 天前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287921 天前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本1 天前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211231 天前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python