微软是如何解决 PC 端程序多开问题的
来源:http://www.tudoupe.com时间:2022-05-23
点击上方蓝字
关注我们
(本文阅读时间:4 分钟)
最近发现VB试图使用 C# 来解决个人电脑终端软件的一些问题。 NET的 WinForm 程序提供了非常简单的方法来完成:

没有代码,只有勾。
今天,我们将向大家展示微软如何处理多种个人电脑终端应用程序, 以及如何在C#中履行同样的功能。
微软MVP实验室调查员

张海
微软最有价值的专家,主要专注于.NET相关技术和解决方案,致力于将个人投入转换成一个输出,即公共电话号码:我的IO。
原理1
应用程序库窗口格式
汇编 VB.NET WinForm 程序, 反向汇编源代码和定位接入点 Main 方法:

MyApplication 是 Windows Forms Application Base 的子孙。 MyApplication 是 Windows Forms Application Base 的子孙 。基本类别的运作职能已经落实。内部运行方法使用是单声调来确定是否要启动 用单个实例应用程序 :
而 IsSingleInstance 以下属性是条目类构造函数中的指定值 :

实现1
通过引用 NuGet 软件包 微软。 视觉Bacic 与C##,我们也可以继承。WindowsFormsApplicationBase基类,为IsSingleInstance要完成单个实例应用程序, 请使用属性属性属性值 :
protected override void OnCreateMainForm() { MainForm =newForm1; }
[STAThread] static void Main(string[] args) { newProgram.Run(args); } }
虽然上述认识是直截了当的,但仅适用于WinForm应用程序,必须称为微软.VisualBacic图书馆。
因此,我们决定深入探索如何实现这一点。
原理2-命名管道
通过查看WindowsFormsApplicationBase的Run完成的方法( 代码已删除) :
可以推断,微软方案对大量个人计算机终端应用的微软解决方案的内部实现原则如下:
如果创建成功,则用WaitForClientConnectionsAsync正在等待第二号应用程序连接
如果创建失败,则用SendSecondInstanceArgsAsync向第一次申请提供资料。
名称管道提供管道服务器与一个或多个管道客户端之间的进程间通信。 它们提供基于信息的互动, 并允许多个客户端同时使用相同的管道名称连接到服务器进程 。
关于如何使用指示的进一步信息,请见官方出版物《使用命名管道的网络处理之间的通信》[1]。
实现2
以下是如何使用控制台程序创建具体案例应用的一个例子:
static asyncTaskMain(string[] args) { try { using(varpipeServer =newNamedPipeServerStream( pipeName: pipeName, direction: PipeDirection.In, maxNumberOfServerInstances:1, transmissionMode: PipeTransmissionMode.Byte, options: NamedPipeOptions)) { WaitForClientConnectionsAsync(pipeServer,str => Console.WriteLine(str));
Console.WriteLine($"start server{args[0]}"); Console.ReadKey; } } catch { awaitSendSecondInstanceArgsAsync(=>$"call from{args[0]}").ConfigureAwait(false); } }
需要注意的是 ,WaitForClientConnectionsAsync不能加await, 否则,随后的守则将无法执行。
Async Wait for Client 连接器
实现代码如下 :
try { const int bufferLength = 1024; var buffer = new byte[bufferLength]; using (var stream = new MemoryStream) { while (true) { var bytesRead = await pipeServer.ReadAsync(buffer.AsMemory(0, bufferLength), cancellationTokenSource.Token).ConfigureAwait(false); if (bytesRead == 0) { break; } stream.Write(buffer, 0, bytesRead); }
stream.Seek(0, SeekOrigin.Begin);
callback(Encoding.UTF8.GetString(stream.ToArray)); } } finally { pipeServer.Disconnect; } } }
循环等待客户端连接
接收客户端提供的数据并将其转换为字符串 。
调用callback处理字符串,这里是str => Console.WriteLine(str)
断开客户端连接
循环等待客户端连接
接收客户端提供的数据并将其转换为字符串 。
调用callback处理字符串,这里是str => Console.WriteLine(str)
断开客户端连接
AssyncSend Send SextInstance 配置器
实现代码如下:
await pipeClient.ConnectAsync(cancellationTokenSource2.Token).ConfigureAwait(false);
await pipeClient.WriteAsync(Encoding.UTF8.GetBytes(func), cancellationTokenSource2.Token).ConfigureAwait(false); } }
建立客户与当地管道服务处的连接。
- 向服务端发送 func 产生的数据,这里是 => $"call from {args[0]}"
建立客户与当地管道服务处的连接。
Demo
创建多开脚本:
start " " "ConsoleApp1.exe" secondInstance
start " " "ConsoleApp1.exe" thirdInstance
安装后,我们发现软件只能打开一次。 他们还从其他各种应用中获得了数据:
参考资料
[1] 使用命名的网络-处理通信管道:
https://docs.microsoft.com/zh-cn/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication?WT.mc_id=DT-MVP-38491
[1] 使用命名的网络-处理通信管道:
https://docs.microsoft.com/zh-cn/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication?WT.mc_id=DT-MVP-38491
微软公司最宝贵的专业(MVP)
微软公司最有用的专家是微软公司向第三方技术专家颁发的全球奖项。 在过去29年中,世界各地的技术界领导人因分享在线和离线技能和经验而赢得了荣誉。
MVP是一个自选的专家小组。他们是最有才华和最聪明的人。他是一名专题专家,对社区既热情又有帮助。MVPs向其他人提供服务,包括演讲、回答论坛询问和答复、开发网站、博客、分享视频、开放源码项目、安排集会等等。此外,使微软技术界的成员最大限度地利用微软技术。
更多信息可在官方网站上查阅:
https://mvp.microsoft.com/zh-cn
使用命名的管道进行网络到处理通信
上一篇:上市公司被爆监督居家员工,5分钟抓拍一次人脸 员工:厕所都不敢去
下一篇:没有了
相关新闻
- 2022-05-23 上市公司被爆监督居家员工,5分钟
- 2022-05-23 微软 Win11 更新录音机应用:采用可
- 2022-05-23 Win11推送KB5013943更新补丁:修复安全
- 2022-05-23 微软 Win11 更新录音机应用:采用可
- 2022-05-23 联想笔记本新增入门款,配i5-1235
- 2022-05-23 刚刚:国产OLED掌机AYANEO AIR发布会定
- 2022-05-23 荣耀官宣!5月16日举办MagicBook 14新
- 2022-05-23 登顶吾爱热门的小工具,好用又方
- 2022-05-23 Python处理PDF神器:PyMuPDF的安装与使
- 2022-05-23 如何在 Windows 10 上安装 PowerShell 7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
