C#实现托盘程序并禁止多个应用实例运行的方法

我来为您详细讲解“C#实现托盘程序并禁止多个应用实例运行的方法”的完整攻略:

实现托盘程序

实现托盘程序需要使用到.Net Framework提供的NotifyIcon控件,下面是一个简单的示例代码:

private NotifyIcon notifyIcon; // 托盘图标

public Form1()
{
    InitializeComponent();
    notifyIcon = new NotifyIcon();
    notifyIcon.Text = "托盘程序";
    notifyIcon.Icon = new Icon("icon.ico");
    notifyIcon.Visible = true;
    notifyIcon.MouseClick += new MouseEventHandler(notifyIcon_MouseClick);
}

private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        // 左键单击托盘图标时的处理逻辑
    }
}

禁止多个应用实例运行

实现禁止多个应用实例运行可以使用Mutex类,下面是一个简单的示例代码:

private static Mutex mutex = null;

if (!mutex.WaitOne(TimeSpan.FromSeconds(3), false))
{
    MessageBox.Show("程序已经在运行中...");
    Application.Exit();
}
else
{
    Application.Run(new Form1());
}

以上代码中,通过创建一个命名为"MutexName"的Mutex对象,并使用WaitOne方法来判断是否已经有一个同名的应用程序正在运行。如果已经有另外一个实例在运行,则弹出提示窗口并退出应用程序,否则正常运行。

示例说明

示例1

以下代码实现了一个托盘程序,当右键点击托盘图标时,弹出“关于”窗口,当左键点击托盘图标时,弹出“退出”提示框并退出应用程序,实现了禁止多个实例同时运行。

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace TrayApp
{
    static class Program
    {
        private static Mutex mutex = null;

        [STAThread]
        static void Main()
        {
            bool createdNew;

            mutex = new Mutex(true, "TrayAppMutex", out createdNew);

            if (!createdNew)
            {
                MessageBox.Show("程序已经在运行中...");
                return;
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        private class Form1 : Form
        {
            private NotifyIcon notifyIcon;
            private ContextMenu contextMenu;
            private MenuItem menuItemAbout;
            private MenuItem menuItemExit;

            public Form1()
            {
                notifyIcon = new NotifyIcon();
                contextMenu = new ContextMenu();
                menuItemAbout = new MenuItem();
                menuItemExit = new MenuItem();

                // 初始化控件
                notifyIcon.Icon = new Icon("icon.ico");
                notifyIcon.Visible = true;

                contextMenu.MenuItems.AddRange(new MenuItem[] {
                    menuItemAbout,
                    new MenuItem("-"), // 分割线
                    menuItemExit});

                menuItemAbout.Text = "关于";
                menuItemAbout.Click += new EventHandler(menuItemAbout_Click);

                menuItemExit.Text = "退出";
                menuItemExit.Click += new EventHandler(menuItemExit_Click);

                notifyIcon.ContextMenu = contextMenu;
            }

            private void menuItemAbout_Click(object sender, EventArgs e)
            {
                MessageBox.Show("这是一个托盘应用程序");
            }

            private void menuItemExit_Click(object sender, EventArgs e)
            {
                if (MessageBox.Show("确定要退出程序吗?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    Application.Exit();
                }
            }

            protected override void OnFormClosing(FormClosingEventArgs e)
            {
                if (MessageBox.Show("确定要退出程序吗?", "提示", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    e.Cancel = true;
                }
            }
        }
    }
}

示例2

以下代码实现了禁止重复运行功能,通过命名管道通讯的方式与其他进程通讯来检测是否已经有另外一个进程在运行。

using System;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.Windows.Forms;

namespace SingleInstanceApplication
{
    static class Program
    {
        private const string PipeName = "SingleInstanceNamedPipe";
        private static Mutex mutex = null;

        [STAThread]
        static void Main()
        {
            bool createdNew;
            mutex = new Mutex(true, "SingleInstanceMutex", out createdNew);

            if (!createdNew)
            {
                if (MessageBox.Show("已经有一个实例正在运行,要退出当前实例吗?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    // 发送退出命令
                    using (var pipe = new NamedPipeClientStream(".", PipeName, PipeDirection.InOut))
                    {
                        pipe.Connect();
                        using (var sr = new StreamReader(pipe))
                        using (var sw = new StreamWriter(pipe))
                        {
                            sw.WriteLine("exit");
                            sw.Flush();
                            var response = sr.ReadLine();
                            if (response == "exit")
                            {
                                // 成功发送退出命令
                            }
                        }
                    }
                }
                return;
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1(PipeName));
        }

        private class Form1 : Form
        {
            private string pipeName;

            public Form1(string pipeName)
            {
                this.pipeName = pipeName;

                // 初始化控件
                var label = new Label();
                label.Text = "这是一个单实例应用程序";
                label.Font = new Font("微软雅黑", 24, FontStyle.Bold);
                label.Dock = DockStyle.Fill;

                Controls.Add(label);

                // 监听命令管道
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    using (var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut))
                    {
                        pipe.WaitForConnection();
                        using (var sr = new StreamReader(pipe))
                        using (var sw = new StreamWriter(pipe))
                        {
                            while (true)
                            {
                                var command = sr.ReadLine();
                                if (command == "exit")
                                {
                                    sw.WriteLine("exit");
                                    sw.Flush();
                                    Application.Exit();
                                    break;
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

以上两个示例代码都是基于C#语言实现的,分别通过使用NotifyIcon控件和命名管道通讯的方式实现了托盘程序和禁止多个实例同时运行的功能,供您参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现托盘程序并禁止多个应用实例运行的方法 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • Asp.Net数据控件引用AspNetPager.dll分页实现代码

    当我们需要在ASP.NET应用程序中使用分页功能时,可以使用第三方控件,其中一个比较流行的控件就是AspNetPager.dll。以下是使用AspNetPager.dll控件实现分页的完整攻略: 1. 引用AspNetPager.dll控件 首先需要在项目中引用AspNetPager.dll控件,可以通过NuGet包管理器来进行安装。在Visual Stud…

    C# 2023年5月31日
    00
  • C#简单生成随机密码的方法示例

    下面我来为您详细讲解“C#简单生成随机密码的方法示例”的完整攻略。 1. 生成随机密码 生成随机密码的方法比较多,可以通过随机函数生成随机字符序列,也可以从字符集中随机选取字符生成密码。下面我将介绍几种方法。 1.1 使用 Random 类 可以使用 Random 类生成随机数,然后将生成的随机数转为希望的字符序列(如数字、字母和特殊字符),从而组成随机密码…

    C# 2023年6月7日
    00
  • ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一)

    ASP.NET 4.5.1 + MVC 5.0设置系统角色与权限(一) 在ASP.NET MVC应用程序中,设置系统角色和权限是非常重要的。本文将介绍如何使用ASP.NET 4.5.1和MVC 5.0设置系统角色和权限。 步骤1:创建角色 首先,我们需要创建系统角色。可以在Global.asax.cs文件中的Application_Start方法中添加以下代…

    C# 2023年5月15日
    00
  • C#实现属于自己的QQ截图工具

    下面是详细讲解如何实现属于自己的QQ截图工具的攻略。 准备工作 在开始之前,你需要准备以下资源: C#编程语言基础知识 Visual Studio开发工具 Windows窗口操作相关的API知识 截图相关的API知识 实现步骤 创建Windows窗体应用程序项目。 在窗体上添加一个按钮控件,命名为“截屏”。 添加按钮的Click事件响应方法,并在该方法中编写…

    C# 2023年6月6日
    00
  • VS2019中.NET如何实现打日志功能

    下面我将为您详细讲解如何在VS2019中使用.NET实现打印日志功能。 1. 添加NuGet包 首先,我们需要添加NuGet包,来使用.NET提供的日志库。打开VS2019的NuGet包管理器,搜索属性“Microsoft.Extensions.Logging”,并安装该NuGet包。 2. 创建Logger实例 在代码中创建ILogger实例,使用Logg…

    C# 2023年5月31日
    00
  • C# Winform消息通知系统托盘气泡提示框ToolTip控件

    一、引言 在C# Winform界面开发中,消息通知和提示框往往是必不可少的功能。Winform提供了两种常用的消息通知方式:系统托盘气泡提示和ToolTip控件。本文将详细讲解如何使用这两种控件。 二、系统托盘气泡提示 添加系统托盘图标 在Winform中使用系统托盘气泡提示,首先需要在窗体上添加一个NotifyIcon控件,用于显示图标。添加方法如下: …

    C# 2023年6月7日
    00
  • c#字符串使用正则表达式示例

    下面是c#字符串使用正则表达式的完整攻略: 1. 使用正则表达式匹配字符串 使用c#中的正则表达式需要使用System.Text.RegularExpressions命名空间。下面是一个示例代码,其使用正则表达式匹配字符串,并将匹配到的结果输出到控制台: using System; using System.Text.RegularExpressions; …

    C# 2023年6月8日
    00
  • Entity Framework使用LINQ操作实体

    下面我将为你详细讲解如何使用Entity Framework使用LINQ操作实体。 什么是Entity Framework Entity Framework(EF)是一个面向对象的ORM(Object/Relational Mapping,对象关系映射)框架。通过EF,我们可以将数据库中的数据转换为对象,在程序中使用对象的方式操作数据库。它使得我们可以使用像…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部