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 无刷新分页实例代码

    ASP.NET 是一款开放源码的服务器端 Web 应用程序框架,提供了丰富的功能和强大的工具,为开发者提供了高效的方式来构建、部署和维护 Web 应用程序。无刷新分页是其中一个常见需求,本文将通过两个示例来演示如何实现ASP.NET无刷新分页功能。 示例1:使用AJAX实现无刷新分页 步骤1:创建数据库表和数据 CREATE TABLE [dbo].[Use…

    C# 2023年5月31日
    00
  • 浅谈Silverlight 跨线程的使用详解

    浅谈Silverlight 跨线程的使用详解 什么是线程 线程是计算机中执行最小的单元,简单地说,就是能够执行一些指令,用来完成某个任务的最小单位。每个线程都有自己的代码指令、堆栈、寄存器等,线程之间可以进行通信,也可以共享一些资源。 跨线程的使用 在Silverlight中,我们常常遇到需要在其他线程执行一些操作,比如在UI线程之外执行一些耗时的操作,防止…

    C# 2023年6月7日
    00
  • ASP .NET Core API发布与部署以及遇到的坑和解决方法

    ASP .NET Core API发布与部署以及遇到的坑和解决方法 在ASP .NET Core应用程序中,发布和部署API是一项非常重要的任务。在本攻略中,我们将介绍ASP .NET Core API发布与部署的方法,并提供两个示例说明。 1. 发布API 在ASP .NET Core应用程序中,发布API可以使用Visual Studio或者命令行工具进…

    C# 2023年5月16日
    00
  • ASP.NET Core如何知道一个请求执行了哪些中间件?

    第一步,添加Nuget包引用 需要添加两个Nuget包分别是:Microsoft.AspNetCore.MiddlewareAnalysis和Microsoft.Extensions.DiagnosticAdapter,前者是分析记录中间件核心代码实现后者是用来接收日志输出的,由于是用的DiagnosticSource方式记录日志,所以需要使用Diagnos…

    C# 2023年4月18日
    00
  • C# Stream.Close – 关闭流

    C# 中 Stream.Close 方法主要用于关闭流对象,并释放底层资源,以确保相关资源的可用性。 方法签名 public virtual void Close(); 该方法不接受参数,也不返回任何值。 使用方法 使用 Stream.Close 方法时应该注意以下几点: 该方法会释放所有资源和锁定文件。 如果在流上有未决定的异步操作,该操作可能会失败并引发…

    C# 2023年4月19日
    00
  • C# Add(T):将元素添加到 ICollection

    C#中的Add(T)方法主要是用来向List集合中添加元素的,T代表数据类型,可以是整型、浮点型、字符串、对象等等。本文将详细讲解C# Add(T)方法的使用方法和注意点。 语法 以下是Add(T)方法的基本语法: public void Add(T item); 参数 Add(T)方法的参数是要添加到List集合中的元素。 返回值 Add(T)方法没有返回…

    C# 2023年4月19日
    00
  • ListView用法中与滚动相关的需求实现

    ListView是Android中常用的控件之一,它可以显示多个数据项,使得用户可以通过上下滑动来浏览不同的数据,因此与滚动相关的需求是ListView中的重要部分,本文将对ListView的滚动相关的需求进行详细讲解。 ListView滚动相关的需求 ListView滚动相关的需求包括两种:滚动控制和滚动监听。 滚动控制需要实现以下需求: 滚动到指定位置 …

    C# 2023年6月6日
    00
  • Aspx/Asp.net 防注入程序 V1.0

    “Aspx/Asp.net 防注入程序 V1.0”是一款用于防范SQL注入攻击的程序,其主要功能是对用户输入的信息进行过滤和保护,避免恶意攻击。下面是使用该程序的完整攻略: 步骤一:下载安装程序 首先需要到程序官网(例如GitHub)上下载“Aspx/Asp.net 防注入程序 V1.0”的安装程序,然后按照提示进行安装,安装完成后就可以开始使用该程序。 步…

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