WPF程序设置单例启动(互斥体)

在WPF(Windows Presentation Foundation)应用程序中实现单例模式,确保程序只能打开一个实例,可以通过多种方式实现。下面是一种常见的方法,使用互斥体(Mutex)来实现单例打开。

步骤

  1. 创建一个新的WPF项目:首先,在Visual Studio中创建一个新的WPF应用程序项目。

  2. 添加互斥体检查 :在App.xaml.cs文件中,添加互斥体检查逻辑。如果检测到另一个实例正在运行,则关闭当前实例。

以下是详细的实现步骤和代码示例:

App.xaml.cs
csharp 复制代码
using System;
using System.Threading;
using System.Windows;

namespace YourNamespace
{
    public partial class App : Application
    {
        private const string MutexName = "Global\\YourUniqueMutexName"; // 确保这个名称是唯一的
        private Mutex mutex;

        protected override void OnStartup(StartupEventArgs e)
        {
            bool isOwned;
            mutex = new Mutex(true, MutexName, out isOwned);

            if (!isOwned)
            {
                // 如果互斥体已被另一个实例拥有,则关闭当前实例
                MessageBox.Show("Another instance of the application is already running.", "Application Running", MessageBoxButton.OK, MessageBoxImage.Warning);
                Application.Current.Shutdown();
                return;
            }

            base.OnStartup(e);
        }

        protected override void OnExit(ExitEventArgs e)
        {
            if (mutex != null)
            {
                mutex.ReleaseMutex();
                mutex.Dispose();
            }
            base.OnExit(e);
        }
    }
}

代码说明

  1. MutexName:这是一个全局唯一的名称,用于标识互斥体。确保这个名称在整个系统中是唯一的,以避免与其他应用程序的互斥体冲突。

  2. Mutex 构造函数new Mutex(true, MutexName, out isOwned) 尝试创建一个新的命名互斥体,并检查是否成功创建(即是否拥有该互斥体)。

    • 如果 isOwnedtrue,则表示当前实例是第一个(且唯一的)拥有该互斥体的实例,程序可以继续运行。
    • 如果 isOwnedfalse,则表示另一个实例已经拥有该互斥体,当前实例应关闭。
  3. MessageBox:如果检测到另一个实例正在运行,则显示一个消息框,并关闭当前实例。

  4. OnExit:在应用程序退出时,释放并销毁互斥体,以释放系统资源。

注意事项

  • 互斥体名称:确保互斥体名称是全局唯一的,可以使用公司名称、产品名称、版本号等信息来构造一个独特的名称。
  • 错误处理:在实际应用中,应添加更多的错误处理逻辑,例如处理互斥体创建失败的情况。
  • 资源清理:确保在应用程序退出时正确释放和销毁互斥体,以避免资源泄漏。

通过上述步骤,你可以在WPF应用程序中实现单例打开功能,确保程序只能打开一个实例。

相关推荐
wangnaisheng5 小时前
【WPF】Opacity 属性的使用
wpf
姬激薄10 小时前
配置Hadoop集群-集群配置
wpf
python算法(魔法师版)10 小时前
.NET 在鸿蒙系统上的适配现状
华为od·华为·华为云·.net·wpf·harmonyos
大道随心21 小时前
【wpf】11 在WPF中实现父窗口蒙版效果:原理详解与进阶优化
wpf
zizisuo1 天前
9.1.领域驱动设计
wpf
大道随心1 天前
【wpf】10 C#树形控件高效实现:递归构建与路径查找优化详解
开发语言·c#·wpf
离歌漠2 天前
WPF内嵌其他进程的窗口
c#·wpf
沉到海底去吧Go2 天前
【身份证识别表格】批量识别身份证扫描件或照片保存为Excel表格,怎么大批量将身份证图片转为excel表格?基于WPF和腾讯OCR的识别方案
ocr·wpf·excel·身份证识别表格·批量扫描件身份证转表格·图片识别表格·图片识别excel表格
csdn_aspnet2 天前
WPF 性能 UI 虚拟化 软件开发人员的思考
ui·wpf
冰茶_2 天前
WPF之绑定模式深入
学习·microsoft·微软·c#·wpf·绑定模式