C#开发单实例应用程序并响应后续进程启动参数
C#默认的WinForm模板是不支持设置单实例的,也没有隔壁大哥VB.NET那样有个“生成单个实例应用程序”的勾选选项(VB某些时候要比C#更方便),实现单实例可以有多种方法:
-
检测同名进程:Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName),如果集合的Length > 1那就表明已有同名进程了,如果有需要还可以进一步检查该进程的路径;
-
命名互斥锁:Mutex,网上介绍的很多都是这种方法;
-
锁定文件:使用File.Create方法创建文件并在程序退出时释放,如果创建失败则表明已经有实例在运行;
-
VB.NET方法:WindowsFormsApplicationBase,个人认为该方法最完美,可以接收后续进程的启动参数,还可以弹出前序进程的主窗体。
WindowsFormsApplicationBase是一个Microsoft.VisualBasic.ApplicationServices命名空间下的类,是微软为VB.NET实现应用程序启动控制的类,其内部是以命名管道通信来实现的。既然是同一个爹的东西,C#拿过来用毫无违和感。Microsoft.VisualBasic和Microsoft.CSharp一样,都是.NET Framework中的一部分,不用担心会缺少运行环境。
WindowsFormsApplicationBase类的一些常用属性和方法:
-
属性IsSingleInstance:设置当前进程是否为单实例进程,在构造方法中设置,如果是后续进程且为值true,构造方法结束后会给前序进程发送启动参数,然后就退出进程了,不会执行到下面的OnStartup;
-
方法OnStartup:首次启动后运行,返回false就会退出进程,后续进程永远不会运行到该方法;
-
方法OnStartupNextInstance:后续进程启动后的重写方法,前序进程会接收到后续进程的启动参数,弹出主窗体等;
-
方法OnCreateMainForm:创建主窗体的重写方法,必须指定主窗体。
创建一个单实例应用程序并响应后续进程参数的大概过程:
-
创建一个项目名称为“SingleInstanceSample”的Windows窗体项目;
-
添加引用“Microsoft.VisualBasic”;
-
重命名“Form1”为“MainForm”;
-
添加类“ApplicationBase.cs”,继承自“WindowsFormsApplicationBase”;
-
修改“Program.cs”,从“ApplicationBase”启动。
各个类的代码如下:
-
Program.cs
using System;
using System.Windows.Forms;namespace SingleInstanceSample
{internal static class Program{[STAThread]static void Main(string[] args){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);var app = new ApplicationBase();app.Run(args);}}
}
-
ApplicationBase.cs
using Microsoft.VisualBasic.ApplicationServices;
using System.IO;namespace SingleInstanceSample
{internal class ApplicationBase : WindowsFormsApplicationBase{public ApplicationBase() : base(AuthenticationMode.Windows){//指示进程为单进程:IsSingleInstancebase.IsSingleInstance = true;base.SaveMySettingsOnExit = true;base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;}/// <summary>/// 首次启动后的重写方法,返回false就会退出进程,/// 比如可以显示登录窗体,登录失败返回false就不会运行到OnCreateMainForm/// </summary>protected override bool OnStartup(StartupEventArgs eventArgs){base.OnStartup(eventArgs);//处理当前进程的启动参数return true;}/// <summary>/// 后续进程启动后的重写方法/// </summary>protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs){base.OnStartupNextInstance(eventArgs);//处理后续进程的启动参数}/// <summary>/// 指定主窗体,/// 除非OnStartup返回false,否则必须指定主窗体/// </summary>protected override void OnCreateMainForm(){base.MainForm = new MainForm();}}
}
文章转载自:【一路向东】
原文链接:https://www.cnblogs.com/yiluxiangdong/p/18288392
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构
相关文章:
C#开发单实例应用程序并响应后续进程启动参数
C#默认的WinForm模板是不支持设置单实例的,也没有隔壁大哥VB.NET那样有个“生成单个实例应用程序”的勾选选项(VB某些时候要比C#更方便),实现单实例可以有多种方法: 检测同名进程:Process.GetProcessesByNa…...

STM32智能机器人导航系统教程
目录 引言环境准备智能机器人导航系统基础代码实现:实现智能机器人导航系统 4.1 数据采集模块 4.2 数据处理与导航算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:机器人导航应用与优化问题解决方案与优化收尾与总结 1. 引言 智能机器…...

Android 15 适配之16K Page Size :为什么它会是最坑的一个适配点
首先什么是 Page Size ?一般意义上,页面(Page)指的就是 Linux 虚拟内存管理中使用的最小数据单位,页面大小(Page Size)就是虚拟地址空间中的页面大小, Linux 中进程的虚拟地址空间是由固定大小的页面组成。 Page Size 对于虚拟内…...

下载linux的吐槽
本来这几天放假了,想下一个linux玩一玩 教程(我就是根据这个教程进行下载的,但是呢在进行修改BIOS 模式的 地方遇见了困难,也许是电脑修过的原因,我狂按F12 以及 FnF12都没有BIOS设置,只有一个让我选择用w…...

【HTML入门】第四课 - 换行、分割横线和html的注释
这一小节,我们继续说HTML的入门知识,包括换行、横线分割以及注释(html的注释)。 目录 1 换行 2 分割横线 3 html注释 1 换行 html中分为块元素和行内元素。这一小节呢,先不说这些元素们,我们先说一下换…...

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产
任务描述 电信数据生产是一个完整且严密的体系,这样可以保证数据的鲁棒性。在本项目的数据生产模块中,我们来模拟生产一些电信数据。同时,我们必须清楚电信数据的格式和数据结构,这样才能在后续的数据产生、存储、分析和展示环节…...

Kotlin中的数据类型
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...

提高交易决策质量,Anzo Capital昂首资本只需两个交易策略
要想提高交易决策质量,其实很简单,Anzo Capital昂首资本只需两个交易策略,结合价格行为和VSA(成交量与价格分析)就可以达成我们的目的。首先,理解这两个概念: 1. 价格行为:价格行为是市场价格变动的方式&a…...

Ubuntu TensorRT安装
什么是TensorRT 一般的深度学习项目,训练时为了加快速度,会使用多 GPU 分布式训练。但在部署推理时,为了降低成本,往往使用单个 GPU 机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也…...

spring mvc学习
第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架, 是Spring Framework生态中的一个独立模块,它基于 Spring 实现了Web MVC(数据、业务与展现)设计模式的请求驱动类型的轻量级Web框架&am…...
第4集《修习止观坐禅法要》
请打开讲义第七面,四、悟道。 我们前面讲到智者大师出家以后,他除了持戒以外,一方面拜忏,一方面就是打坐,来调伏他过去的烦恼跟罪业,以为他未来圆顿止观的一个基础,这以下讲到他开悟的情况&…...
IPython 日志的开关:精通 %logoff 命令的实用指南
IPython 日志的开关:精通 %logoff 命令的实用指南 在 IPython 的强大功能中,日志记录是一个不可或缺的工具,它帮助用户记录会话历史,以便日后分析和重现。%logoff 命令作为日志记录功能的补充,允许用户在需要时停止日…...

Redis 分布式集群方案 Cluster
引言 相比于Codis,Redis Cluster是Redis官方提供的解决方案。相比于Codis的不同,他是去中心化的,如图所示,该集群有三个Redis节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据多少可能不一样…...
Redis的两种持久化方案
Redis 提供了多种持久化机制来保证数据在发生意外情况下(如断电或服务器崩溃)不丢失。以下是几种主要的 Redis 持久化方案及其特点: 1. RDB (Redis Database Backup) RDB 是 Redis 创建的数据库快照,它可以将数据集快照以二进制…...
Spring中常见知识点及使用
Spring Framework 是 Java 生态系统中最流行的开源框架之一,它提供了一系列强大的功能,用于构建企业级应用。以下是一些常见的 Spring 知识点及其使用方法: 1. 依赖注入(Dependency Injection) 依赖注入是 Spring 的…...

Excel 宏录制与VBA编程 ——VBA编程技巧篇二 (合并内容相同连续单元格、取消合并单元格并在每个单元格中保留内容)
1、合并内容相同的连续单元格 如果需要合并如图所示的工作表中B列中部门相同的连续单元格 VBA代码: Sub Mergerng()Dim IntRow As IntegerDim i As IntegerApplication.DisplayAlerts FalseWith Sheet1IntRow .Range("A65536").End(xlUp).RowFor i In…...
理解和应用工业设备字典文件:一篇详细指南
理解和应用工业设备字典文件:一篇详细指南 在工业自动化领域,设备和模块的配置和管理是一个复杂而重要的任务。为了简化这个过程,字典文件被广泛应用于描述离线对象字典。本文将详细解释字典文件的用途、格式,并举例说明如何引用…...

Python酷库之旅-第三方库Pandas(010)
目录 一、用法精讲 22、pandas.read_hdf函数 22-1、语法 22-2、参数 22-3、功能 22-4、返回值 22-5、说明 22-6、用法 22-6-1、数据准备 22-6-2、代码示例 22-6-3、结果输出 23、pandas.HDFStore.put方法 23-1、语法 23-2、参数 23-3、功能 23-4、返回值 23-5…...
海康威视监控web实时预览解决方案
海康威视摄像头都试rtsp流,web页面无法加载播放,所以就得转换成web页面可以播放的hls、rtmp等数据流来播放。 一:萤石云 使用萤石云平台,把rtsp转化成ezopen协议,然后使用组件UIKit 最佳实践 萤石开放平台API文档 …...

ubuntu运行qq音乐闪退
ubuntu运行qq音乐闪退 修改/usr/share/applications中的qqmusic.desktop,在Exec后加上 --no-sandbox,如下图所示: 该文件有可能是只读,权限不够的话用sudo vim qqmusic.desktop...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...