尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

完整教程:C# 主窗口 单例 唯一进程 互斥锁

完整教程:C# 主窗口 单例 唯一进程 互斥锁
📅 发布时间:2026/6/19 6:31:34

用第一个就行

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

相关新闻

  • 2025年粘度计厂家权威推荐榜:在线/旋转/振动/在线振动/在线旋转/实验室旋转/实验室在线/反应釜在线/管线在线振动/实验室振动粘度计专业选购指南
  • 2025 年国内装修公司最新推荐排行榜:聚焦高端定制与环保需求,精选优质品牌供业主参考苏州高端/装修收纳设计/不锈钢橱柜/别墅装修公司推荐
  • Vue每日一题 父子组件通信

最新新闻

  • Elastic 被评为 IDC MarketScape《2026 年全球 SIEM 厂商评估》领导者
  • 2026银川2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 字节跳动拟购5万颗AI芯片,国产GPU竞争聚焦生态、成本与产能
  • 基于深度学习的糖尿病视网膜病变自动检测系统构建实战
  • Obsidian MCL布局:模块化CSS让你的笔记排版焕然一新
  • 逆向工程实战:从加密音乐文件到通用音频格式的转换原理

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号