微软是如何解决 PC 端程序多开问题的

前言

在公众号上看到一篇文章《C#中解决PC端程序多开的问题》。

该文作者是通过创建互斥锁Mutex实现的:

bool mutexCreated;
var mutex = new Mutex(true, "MyApp", out mutexCreated);
if (mutexCreated)
{Application.Run(new Form1());
}
else
{MessageBox.Show("该程序已打开");
}

其实,VB.NET 的 WinForm 程序提供了一个更简单的实现方式:

51f551e16971ce2011f8db783cbf5e83.png

无需任何代码,只需打个勾

现在很少有人用 VB.NET 了,能不能迁移相同功能到 C# 中呢?

原理

编译一个 VB.NET 的 WinForm 程序,反编译源代码,找到入口Main方法:

04684aa9e2a3e3b46fd18b85ff30ec1c.png

该入口类MyApplication继承自WindowsFormsApplicationBase基类,实际执行的基类的Run方法。

Run方法内部使用IsSingleInstance属性,判断是否启用单个实例应用程序

e7e361a6b0340085704010f73e7d2fac.png

IsSingleInstance属性是在入口类的构造函数中赋值的:

public MyApplication(): base(AuthenticationMode.Windows)
{base.IsSingleInstance = true;base.EnableVisualStyles = true;base.SaveMySettingsOnExit = true;base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
}

实现

知道了原理,我们就可以改造 C# 的实现:

class Program :  WindowsFormsApplicationBase
{public Program(){IsSingleInstance = true;}protected override void OnCreateMainForm(){MainForm = new Form1();} [STAThread]static void Main(string[] args){new Program().Run(args);}
}

需要引用 NuGet 包 Microsoft.VisualBasic

接下来,让我们来验证一下。

我们的程序确实只能打开一次,第 2 次运行会将已运行的窗口激活。

结论

今天,我们通过引用Microsoft.VisualBasic解决程序多开的问题!

想了解更多内容,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

磁盘和文件系统管理一

主要掌握规划硬盘中的分区,创建文件系统,挂载卸载文件系统。学会添加并进行分区,学会创建并挂载文件系统。 检测并确认新硬盘 fdisk –l [磁盘设备] 规划磁盘中的分区fdisk [磁盘设备] 用途:在交互是的操作环境中管理磁盘分区 交…

NodeJS-queryString

无论是前端还是后端,经常出现的应用场景是URL中参数的处理。nodeJS的queryString模块提供了一些处理 query strings 的工具。本文将详细介绍nodeJS中的queryStringvar querystring require(querystring);/*{ unescapeBuffer: [Function],unescape: [Function: qsUn…

ASP.NET和ASP.NETCore多环境配置对比

前言多环境配置应该都很熟悉了,最为常见的便是Debug和Release,例如下图是新建的一个asp.net项目,配置文件展开共有三个文件组成据我所知,大多公司从来没编辑过Web.Debug.config和Web.Release.config,一个Web.config文件…

d类功放芯片_应用于无滤波级D类音频功放的新型死区时间控制系统

在音频功率放大领域,由于D类音频功率放大器是基于脉冲宽度调制技术的开关放大器[1-4],用作放大的功率管几乎总是处于或者完全导通或者完全截止的状态,因此其功率损耗比传统的线性放大器小得多,这使得其效率非常高,符合…

【C语言简单说】三:整数变量和输出扩展(2)

尼玛。。。简直蛋了个翔。。。 没保存,,,, ( E___E ) 念昏了头 注:注意我们每一行代码后面的分号表示我们一句代码的结束,就像我们在写文字的时候的标点符号,一个句号表示一句话的结尾。 注…

UML 用例图

用例模型 用例模型用来记录系统的需求,它提供系统与用户及其他参与者的一种通信手段。 执行者 用例图显示了系统和系统外实体之间的交互。这些实体被引用为执行者。执行者代表角色,可以包括:用户,外部硬件和其他系统。执行者往往被…

MAUI初体验:爽

只是记录,只是Hello World体验,别期望太高。1. 前言经过几个小时折腾,Maui环境终于安装好了,先上Hello World截图:1.1 MAUI Windows上MAUI Windows1.2 MAUI Android上MAUI Android2. 今早看到一个群聊推送点击链接可以…

无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。错误解决的方法...

“/CRM”应用程序中的server错误。 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查以下的特定错误具体信息并适当地改动配置文件。 分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。源错误: 行 24: 设…

windows之nslookup命令

1 问题 今天是特别傻逼,既然问了一个很愚蠢的问题,登录后台需要相关的ip,但是我只有域名,这么太突然来,我既然不知道用nslookup命令,好吧,先记录起来,希望下次不要犯这样的傻逼错误 2 查看电脑的所有配置 在windowd 终端输入如下命令 ifconfig/all 3 nslookup正…

动态轮播图

1 /// <reference path"jquery-1.10.2.min.js" />2 var i 0;3 var timer; //设置定时器4 $(function () {5 $("#dlunbo").hover(function () {6 $(".btn").show();7 }, function () {8 $(".btn").hide…

eos操作系统_EOS相机统一的用户界面

自EOS相机诞生起就未改变的基本布局精心设计的操作系统EOS数码单反相机从普及机型到高端机型的按钮布局都是共通的。快门按钮的位置自不必说&#xff0c;主拨盘位置和背面按钮的配置也基本相同。特点是在手柄一侧集中配置用于进行主要操作的按钮。实现了只用右手就能完成拍摄相…

【C语言简单说】三:变量总结ASCII码扩展(5)

前面几个小节都在说变量&#xff0c;那么这一节我们就来总结一下 int表示整数&#xff0c;float表示小数&#xff0c;char表示字符。他们所匹配的&#xff0c;整数&#xff1a;%d&#xff1b;浮点数&#xff1a;%f&#xff1b;字符&#xff1a;%c。 我们来看一个程序&#xf…

Windows之Fiddler抓HTTP和HTTPS请求

1 Fiddler 1) 介绍:Fiddler是抓包工具,原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改 2)下载地址:到Fiddler官网下载,直接百度 Fiddler官网 2 Fiddler抓HTTP的包 比如我们需要抓谷歌浏览器的http请…

java继承与覆盖_简单的继承,方法重载与方法覆盖

[java]代码库package com.jiarui;public class Demo1 {public static void main(String[] args) {Dog dog1 new Dog(2,"大黄");System.out.println(dog1.name"的年龄为&#xff1a;"dog1.getAge());dog1.Cry();Cat cat1new Cat(3,"小花");cat1.C…

【C语言简单说】四:常量

常量和变量是一种相对的概念&#xff0c;在这里我开始跟大家说说常量和变量的区别。可能前几节的小伙伴们并没有能感受出来&#xff0c;不过有了常量的对比那么将会有很好的理解。 .._|||||.. 头昏眼花 常量&#xff0c;就是一些固定的数据&#xff0c;也就是说你把数据装到…

虚幻4 碰撞过滤

原创翻译&#xff0c;转载请注明出处。&#xff08;http://blog.csdn.net/sinat_24229853/article/details/51090259&#xff09; 英文原文&#xff1a;https://www.unrealengine.com/blog/collision-filtering?langzh-CN 选择什么样的碰撞显然是很重要的。但它可能会很棘手&…

基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

前言OK&#xff0c;我也来造轮子了博客系统从一开始用WordPress&#xff0c;再到后来用hexo、hugo之类的静态博客生成放github托管&#xff0c;一直在折腾折腾是为了更好解决问题&#xff0c;最终还是打算自己花时间搞一个好了本系列文章将记录博客的开发过程~ 将会持续更新&am…

Diocp截图

跑了个数据库的查询和插入&#xff0c;删除。 Http SVR DEMO http://123.232.98.202:8081/

【C语言简单说】五:常用运算符

其实。。。这一节我我猜大家几分钟就会了&#xff08;&#xff09;…(⊙_⊙;)… ○圭~○列~~怎麼酱&#xff1f; 因为我相信大家的智商&#xff0c;我就随便给大家提一下就好了。我们看以下的代码&#xff1a; #include<stdio.h> #include<stdlib.h> int main(){…

sql 注入神器sqlmap 源码分析之调试sqlmap

为什么80%的码农都做不了架构师&#xff1f;>>> 相信大家平时 用sqlmap 命令&#xff0c;比如 python sqlmap.py -u"https://team.oschina.net/action/team/create" --data"nameonlyGuest&identonlyGuest&sidentonlyGuest&temp1431349…