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

实现效果

相关推荐
SUPER52662 小时前
FastApi项目启动失败 got an unexpected keyword argument ‘loop_factory‘
java·服务器·前端
咕噜咕噜啦啦2 小时前
Eclipse集成开发环境的使用
java·ide·eclipse
张人玉3 小时前
C# TCP 客户端开发笔记(TcpClient)
笔记·tcp/ip·c#
光军oi5 小时前
全栈开发杂谈————关于websocket若干问题的大讨论
java·websocket·apache
weixin_419658315 小时前
Spring 的统一功能
java·后端·spring
小许学java6 小时前
Spring AI-流式编程
java·后端·spring·sse·spring ai
haogexiaole6 小时前
Java高并发常见架构、处理方式、api调优
java·开发语言·架构
张人玉6 小时前
C# 通讯关键类的API
开发语言·c#
EnCi Zheng7 小时前
@ResponseStatus 注解详解
java·spring boot·后端
wdfk_prog7 小时前
闹钟定时器(Alarm Timer)初始化:构建可挂起的定时器基础框架
java·linux·数据库