带详细注释的 Program.cs 完整代码
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace SFP模块终测检查软件
{
/// <summary>
/// 程序入口类
/// 整个程序从这里开始执行,相当于"大门"
/// </summary>
static class Program
{
/// <summary>
/// 互斥量(Mutex)
/// 作用:防止同一个程序同时运行多个实例
/// 原理:程序启动时创建一把"锁",如果锁已经存在,说明已经有程序在运行了
/// </summary>
private static System.Threading.Mutex mutex;
/// <summary>
/// 应用程序的主入口点
/// 程序启动后第一个执行的函数
/// </summary>
[STAThread] // 特性:表示程序使用单线程单元模型(WinForms必须加这个)
static void Main()
{
// ============================================================
// 第一步:初始化界面样式
// ============================================================
// 启用 Windows 视觉样式
// 作用:让按钮、文本框、单选框等控件使用系统默认的美化样式
// 如果不加这行,控件会是很丑的经典灰色样式
Application.EnableVisualStyles();
// 设置文本渲染方式
// 参数 false:使用 GDI+ 渲染文本(效果更好,更清晰)
// 参数 true:使用旧的 GDI 渲染文本(兼容性更好,但效果差一些)
Application.SetCompatibleTextRenderingDefault(false);
// ============================================================
// 第二步:检查程序是否已经在运行(防止重复启动)
// ============================================================
// 定义变量:标记互斥量是不是"新创建"的
// true = 互斥量是新创建的 → 之前没有程序在运行
// false = 互斥量已经存在了 → 已经有程序在运行了
bool createdNew;
// 创建互斥量(Mutex)
// 参数1:true → 调用者拥有互斥量的初始所有权
// 参数2:互斥量的名字,用程序名作为名字,保证全局唯一
// 参数3:out 输出参数,返回互斥量是不是新创建的
mutex = new System.Threading.Mutex(
true,
System.Diagnostics.Process.GetCurrentProcess().ProcessName, // 获取当前程序的进程名
out createdNew);
// ============================================================
// 第三步:判断是否已经有程序在运行
// ============================================================
// 如果 createdNew = false → 互斥量已经存在 → 已经有程序在运行了
// !createdNew 就是"不是新创建的" = "已经存在了"
if (!createdNew)
{
// 弹出提示框,告诉用户不能重复运行
MessageBox.Show(
"已经运行了本测试程序,不能重复运行,请检查确认。", // 提示内容
"提示", // 标题
MessageBoxButtons.OK, // 按钮类型:只有确定按钮
MessageBoxIcon.Warning); // 图标:警告图标
// 退出程序
Application.Exit();
}
// ============================================================
// 第四步:程序正常启动流程
// ============================================================
else
{
// 创建主窗体对象(但还不显示)
Main_Form main_Form = new Main_Form();
// 创建登录窗体对象
Login_Form login_Form = new Login_Form();
// 显示登录窗体(模态对话框)
// ShowDialog() 的特点:
// 1. 这个窗体不关掉,后面的代码就不会执行
// 2. 用户只能操作这个窗体,不能点后面的主窗体
// 3. 关闭后会返回一个 DialogResult,表示用户是点了确定还是取消
login_Form.ShowDialog();
// ========================================================
// 第五步:判断登录是否成功
// ========================================================
// 如果登录窗体返回的是 OK(用户点了确定/登录按钮)
if (login_Form.DialogResult == DialogResult.OK)
{
// 运行主窗体(程序正式开始,进入主界面)
// Application.Run() 会启动消息循环,让窗体保持显示并响应用户操作
// 直到用户关闭主窗体,程序才会结束
Application.Run(main_Form);
}
// 如果用户点了取消或者直接关了登录窗口
// 就什么也不做,程序直接结束
}
}
}
}
我做了几处优化
1. 变量名改了
把容易误导人的 isAppRunning 改成了 createdNew,一看就知道是"是不是新创建的"。
2. 去掉了重复代码
原来 Application.EnableVisualStyles() 调用了两次,现在只保留一次。
3. 加了更详细的注释
每一段代码都有:
- 这一段是干什么的
- 每个参数是什么意思
- 为什么要这么写
4. 优化了 MessageBox
给 MessageBox.Show() 加上了标题、按钮类型、图标参数,更规范。