LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#】打开程序时如何判断如果已经打开,则不再重复打开,并自动拉到最前端显示,否则才打开程序

admin
2025年9月11日 16:55 本文热度 94

以下是使用C#实现单实例应用程序并激活已运行实例的代码:

using System;

using System.Diagnostics;

using System.Runtime.InteropServices;

using System.Threading;

using System.Windows.Forms;


class Program

{

    // 导入user32.dll函数用于窗口操作

    [DllImport("user32.dll")]

    private static extern bool SetForegroundWindow(IntPtr hWnd);

    

    [DllImport("user32.dll")]

    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    

    [DllImport("user32.dll")]

    private static extern bool IsIconic(IntPtr hWnd);


    private const int SW_RESTORE = 9; // 还原窗口的命令


    static void Main()

    {

        // 使用唯一的Mutex名称(建议使用GUID)

        bool createdNew;

        using (Mutex mutex = new Mutex(true, "Global\\TestAppMutex", out createdNew))

        {

            if (createdNew)

            {

                // 首次启动 - 正常运行程序

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new MainForm()); // 替换为你的主窗体

            }

            else

            {

                // 程序已运行 - 查找并激活现有实例

                Process current = Process.GetCurrentProcess();

                foreach (Process process in Process.GetProcessesByName(current.ProcessName))

                {

                    if (process.Id != current.Id)

                    {

                        IntPtr handle = process.MainWindowHandle;

                        if (handle != IntPtr.Zero)

                        {

                            // 如果窗口最小化则还原

                            if (IsIconic(handle))

                            {

                                ShowWindow(handle, SW_RESTORE);

                            }

                            // 将窗口带到前台

                            SetForegroundWindow(handle);

                            break;

                        }

                    }

                }

            }

        }

    }

}


// 示例主窗体类(需要根据实际项目替换)

public class MainForm : Form

{

    public MainForm()

    {

        this.Text = "Test Application";

        // 这里添加你的窗体初始化代码

    }

}

注意事项:

  1. Mutex名称:使用Global\\前缀确保系统范围内的唯一性,建议使用GUID作为后缀(如Global\\YourGUIDHere)避免与其他程序冲突

  2. 窗口查找逻辑

    • 通过进程名查找已运行的实例

    • 使用MainWindowHandle获取主窗口句柄

    • 先检查窗口是否最小化,如果是则先还原

    • 使用SetForegroundWindow将窗口带到前台

  3. 窗体实现:示例中的MainForm需要替换为实际项目的窗体类

  4. 适用于

    • Windows窗体应用程序(WinForms)

    • 控制台应用程序(需添加对System.Windows.Forms的引用)

如果需要更精确的窗口匹配,可以考虑:

  • 使用进程ID排除当前进程

  • 添加额外的窗口标题检查

  • 使用自定义的IPC通信方式

建议在程序退出时释放Mutex资源(示例中using语句已自动处理)


该文章在 2025/9/11 18:22:09 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved