当前位置: 首页 > news >正文

C# 主窗口 单例 唯一进程 互斥锁

用第一个就行

using Microsoft.VisualBasic.ApplicationServices;namespace EngineEMS {internal static class Program {/// <summary>/// 应用程序的主入口点/// </summary>[STAThread]private static void Main() {ApplicationConfiguration.Initialize();// 使用单实例管理器var singleInstanceManager = new SingleInstanceManager();singleInstanceManager.Run(Environment.GetCommandLineArgs());}}// 单实例应用程序管理器public class SingleInstanceManager : WindowsFormsApplicationBase {private MainForm _mainForm;public SingleInstanceManager() {// 启用单实例应用IsSingleInstance = true;}// 当创建新实例时执行protected override void OnCreateMainForm() {_mainForm = new MainForm();MainForm = _mainForm;}// 当检测到已有实例时执行protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) {base.OnStartupNextInstance(eventArgs);// 激活已存在的主窗口if (MainForm != null) {MainForm.WindowState = FormWindowState.Maximized; // 确保窗口最大化MainForm.Activate();    // 激活窗口MainForm.BringToFront();// 前置窗口MainForm.Focus();       // 设置焦点}}}
}

using System;
using System.IO.Pipes;
using System.Threading;
using System.Windows.Forms;namespace EngineEMS {internal static class Program {// 应用程序唯一标识(建议生成新的GUID)private static readonly string UniqueAppId = $"{{AFC5ASE5-LGHJ-4D5C-9A5A-CNNO20010810}}";private static readonly string PipeName = $"EngineEMS_{UniqueAppId}";private static MainForm _mainForm;/// <summary>/// 应用程序的主入口点/// </summary>[STAThread]private static void Main() {using var mutex = new Mutex(true, UniqueAppId, out bool isNewInstance);if (!isNewInstance) {// 不是第一个实例,通过管道通知第一个实例激活窗口NotifyFirstInstance();return;}try {// 第一个实例,启动管道服务器监听新实例StartPipeServer();// 正常启动应用程序ApplicationConfiguration.Initialize();_mainForm = new MainForm();Application.Run(_mainForm);} finally {// 释放互斥体mutex.ReleaseMutex();}}/// <summary>/// 启动命名管道服务器,监听新实例的激活请求/// </summary>private static void StartPipeServer() {var thread = new Thread(PipeServerLoop) {IsBackground = true,Name = "PipeServerThread"};thread.Start();}/// <summary>/// 管道服务器循环,持续监听新实例/// </summary>private static void PipeServerLoop() {while (true) {try {using var pipeServer = new NamedPipeServerStream(PipeName,PipeDirection.In,1,PipeTransmissionMode.Byte,PipeOptions.Asynchronous);// 等待客户端连接pipeServer.WaitForConnection();// 收到连接,激活主窗口_mainForm?.Invoke((Action)ActivateMainWindow);} catch (Exception ex) {// 记录错误但不中断循环Console.WriteLine($"管道服务器错误: {ex.Message}");Thread.Sleep(1000); // 避免错误时CPU占用过高}}}/// <summary>/// 激活主窗口/// </summary>private static void ActivateMainWindow() {if (_mainForm == null) return;// 恢复窗口(如果最小化)if (_mainForm.WindowState == FormWindowState.Minimized) {_mainForm.WindowState = FormWindowState.Maximized;}// 激活并前置窗口_mainForm.ShowInTaskbar = true;_mainForm.Activate();_mainForm.BringToFront();_mainForm.Focus();}/// <summary>/// 通知第一个实例激活窗口/// </summary>private static void NotifyFirstInstance() {try {using var pipeClient = new NamedPipeClientStream(".", PipeName, PipeDirection.Out);pipeClient.Connect(1000); // 1秒超时// 连接成功即表示通知已发送,无需实际写入数据} catch (TimeoutException) {MessageBox.Show("程序已在运行中,但无法连接到现有实例。","程序已运行",MessageBoxButtons.OK,MessageBoxIcon.Information);} catch (Exception ex) {MessageBox.Show($"程序已在运行中,但发送激活请求时出错:{ex.Message}","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);}}}
}
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;namespace EngineEMS {internal static class Program {/// <summary>/// 应用程序的主入口点/// </summary>[STAThread]private static void Main() {ApplicationConfiguration.Initialize();// 使用单实例管理器var singleInstanceManager = new SingleInstanceManager();singleInstanceManager.Run(Environment.GetCommandLineArgs());}}// 单实例应用程序管理器public class SingleInstanceManager : WindowsFormsApplicationBase {private MainForm _mainForm;public SingleInstanceManager() {// 启用单实例应用IsSingleInstance = true;}// 当创建新实例时执行protected override void OnCreateMainForm() {_mainForm = new MainForm();MainForm = _mainForm;}// 当检测到已有实例时执行protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) {base.OnStartupNextInstance(eventArgs);// 激活已存在的主窗口if (MainForm != null) {// 恢复窗口(如果最小化)if (MainForm.WindowState == FormWindowState.Minimized) {MainForm.WindowState = FormWindowState.Normal;}// 激活并前置窗口MainForm.Activate();MainForm.BringToFront();MainForm.Focus();}// 处理新实例传递的命令行参数if (eventArgs.CommandLine.Count > 0) {// 可以在这里将命令行参数传递给主窗口处理// _mainForm.ProcessCommandLineArgs(eventArgs.CommandLine);}}}
}
http://www.dtcms.com/a/411970.html

相关文章:

  • 重庆网站建设开发公司做网站如何把支付宝微信吧
  • 【Mysql中的锁机制二】
  • 解决微信小程序真机调试中访问本地接口 localhost:8080 报错
  • 从“偶发超时”到“精准定位”:Woody如何让Java接口性能问题无所遁形?
  • 自己做网站平台开发网站的财务分析
  • 创新创业网站建设网站开发竞聘报告
  • 做一个电商网站要多少钱视觉冲击力的网站设计
  • 网站排名快速上升做门户网站可以用的字体
  • 热点数据处理
  • wordpress 5.0.2企业站主题做网站运营需要具备哪些能力
  • TOGAF考试95分通过,我的架构思维蜕变之旅
  • 【读书笔记】架构整洁之道 P5-1 软件架构
  • wordpress整站加密上海智能网站建设公司
  • 石家庄网站定制开发百度搜索高级搜索
  • 云天下网站建设淮南移动网站建设
  • 手机剪辑工具,无广告,无会员,附安卓安装包下载
  • 教育者实战:开发 VS Code 自然语言编程语法标注插件(附完整技术方案)
  • 构建AI智能体:四十五、从专用插件到通用协议:MCP如何重新定义AI工具生态
  • 网站维护一般要几天用dw做网站的代码
  • 网站seo推广平台天水模板型网站建设
  • 网站建设咨询电话腾讯企点下载安装
  • 【MySQL】基本复习框架
  • verilog
  • 网站建设 小白网站开发交什么税
  • 怎么利用公网做网站用idea做html网站
  • uWSGI + HTTPS 实战指南,配置、证书、TLS 终止与调试全流程(适用于生产与真机抓包排查)
  • 京东零售胡浩:智能供应链从运筹到大模型到超级智能体的演进
  • 网站建设哪方面最重要的呢wordpress语言修改
  • 网站开发系统需求说明书站长工具永久更新
  • 矿业工程管理新变革:主流项目管理软件深度剖析