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日

相关文章

  • C# Linq的Join()方法 – 将两个序列中的元素联接在一起

    C#中的Linq提供了Join()方法来实现两个数据源之间的连接。Join()方法接受四个参数,可以在连接过程中指定连接的条件以及返回的结果类型等信息。接下来,我将为您提供一个完整的攻略来详细讲解C# Linq的Join()方法。 Join()方法的基本语法 下面是Join()方法的基本语法: var result = from s in source1 j…

    C# 2023年4月19日
    00
  • C#基础语法:方法参数详解

    C#基础语法:方法参数详解 在 C# 中,方法的参数是指方法接收的数据类型和变量,它是方法的重要组成部分。方法参数允许我们向方法传递值,并在方法中使用这些值。本文将详细讲解 C# 中的方法参数及其使用方法。 方法参数的基本概念 示例方法定义如下所示: public int Add(int num1, int num2) { return num1 + num…

    C# 2023年5月15日
    00
  • MSScriptControl.ScriptControl组件属性、方法、事件介绍

    MSScriptControl 是一个在 Windows 操作系统中可以执行脚本的控件。MSScriptControl 控件开放了 ScriptControl 对象来编写和执行 VBScript 以及 JScript 代码。下面我们将介绍一些 ScriptControl 对象的常用属性、方法和事件。 属性介绍 Language属性 用于指定脚本语言,常用的有…

    C# 2023年5月31日
    00
  • c#处理3种json数据的实例

    C#处理3种JSON数据的实例 在C#中,JSON是一种常见的数据格式,可以使用Newtonsoft.Json库来处理JSON数据。本文将提供3个示例,演示如何处理3种不同类型的JSON数据。 示例1:处理简单的JSON对象 以下示例演示如何处理简单的JSON对象: using Newtonsoft.Json.Linq; using System; name…

    C# 2023年5月15日
    00
  • C# 中用 Sqlparameter 的两种用法

    C#中使用SqlParameter是避免SQL注入攻击的重要手段之一,SqlParameter可以在传递参数的时候对参数值进行格式化和安全验证,保证代码的安全性和稳定性。下面将分别介绍SqlParameter的两种用法。 用法一:SqlParameter构造函数传参 SqlParameter类构造函数可以通过直接传递参数的形式,将参数名和参数类型传递给Sql…

    C# 2023年5月15日
    00
  • C#生成随机数的方法小结

    C#生成随机数的方法小结 介绍 在编程中,如何生成随机数是常见的需求。C#提供了多种生成随机数的方法,本文将对这些方法进行小结介绍。 Random类 Random类是C#提供的随机数生成类,它可以生成伪随机数序列。以下是使用Random类生成随机数的示例: Random random = new Random(); int randomNumber = ra…

    C# 2023年5月31日
    00
  • Unity 如何获取鼠标停留位置下的物体

    获取鼠标停留位置下的物体,需要以下几个步骤: 根据鼠标位置获取射线 发射射线,判断射线是否碰撞到物体 如果碰撞到物体,获取物体信息 下面是具体的实现步骤: 步骤1:根据鼠标位置获取射线 在 Unity 中,可以通过 Camera 的 ScreenPointToRay 方法获取屏幕上一点的射线。 Ray ray = Camera.main.ScreenPoin…

    C# 2023年6月3日
    00
  • ASP.NET Core中的Caching组件简介

    ASP.NET Core中的Caching组件简介 ASP.NET Core中的Caching组件是一种用于缓存数据的机制。它允许我们将数据缓存在内存、分布式缓存或其他缓存存储中,以提高应用程序的性能和响应速度。本攻略将详细介绍ASP.NET Core中的Caching组件的概念、用法和示例。 什么是Caching组件? Caching组件是一种用于缓存数据…

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