Winform只允许运行单个exe程序,第二次点击的时候,可以阻止程序的打开,并且实现了跨进程通信
在Windows桌面应用开发中,有时我们希望确保一个应用程序只能运行一个实例,防止用户无意或恶意地启动多个相同的应用实例。这种需求通常通过检测系统中是否已有相同进程运行来实现,而Winform应用也不例外。本话题将深入探讨如何使用C#在Winform中实现这一功能,并结合跨进程通信技术,使得已运行的程序实例能接收并处理新来的指令。 我们需要检查系统中是否存在相同的进程。在C#中,我们可以利用`System.Diagnostics.Process`类来获取当前运行的进程列表。通过遍历进程列表,查找与我们应用主执行文件(exe)同名的进程,若找到则说明已有实例在运行: ```csharp Process[] processes = Process.GetProcessesByName("YourAppName"); if (processes.Length > 0) { // 已有进程正在运行 } else { // 没有运行的实例,可以启动新进程 } ``` 为了阻止第二个实例的启动,我们可以在主程序入口添加一个全局的mutex(互斥锁),这将防止多个进程同时启动: ```csharp using System; using System.Threading; public static class Program { private static Mutex mutex = new Mutex(true, "Global\\YourAppNameMutex"); [STAThread] public static void Main() { if (!mutex.WaitOne(0, false)) { MessageBox.Show("程序已在运行,不允许再次启动。"); return; } try { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } finally { mutex.ReleaseMutex(); } } } ``` 接下来,我们将讨论跨进程通信。在C#中,有多种实现跨进程通信的方式,如命名管道、内存映射文件、WCF服务等。这里我们选择简单易用的`NamedPipeServerStream`和`NamedPipeClientStream`来实现。首先创建一个服务端(已在运行的应用实例),监听特定的管道名: ```csharp public partial class MainForm : Form { private NamedPipeServerStream pipeServer; public MainForm() { InitializeComponent(); // 创建管道服务器 pipeServer = new NamedPipeServerStream("YourAppNamePipe", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.None); pipeServer.WaitForConnection(); } // 在这里处理接收到的指令 private void OnPipeMessageReceived(object sender, EventArgs e) { byte[] buffer = new byte[1024]; pipeServer.Read(buffer, 0, buffer.Length); string command = Encoding.UTF8.GetString(buffer); // 解析并执行命令... } } ``` 然后在客户端(新的尝试启动的实例),当检测到已有进程运行时,创建一个管道客户端,发送指令给服务端: ```csharp private void SendCommandToRunningInstance(string command) { NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "YourAppNamePipe", PipeDirection.Out); pipeClient.Connect(); byte[] buffer = Encoding.UTF8.GetBytes(command); pipeClient.Write(buffer, 0, buffer.Length); pipeClient.Disconnect(); } ``` 通过这种方式,我们可以确保Winform应用只运行一个实例,并能通过管道通信向已运行的实例发送指令,例如打开特定窗体。这个机制有助于提升用户体验,防止资源浪费,同时也为多实例间的协作提供了可能。在实际应用中,可以根据需求对通信协议进行优化,例如加入错误处理、指令编码解码等,以实现更复杂的交互。
- 1
- 2
- 粉丝: 1756
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三菱电梯主板地址表参数 三菱电梯地址码, 778主板地址参数, 758电梯主板地址参数
- 藏区特产销售平台--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 洞见研报亚太卫星宽带(卫星宽带通信服务商,亚太卫星宽带通信(深圳)有限公司)创投信息
- 在线学籍管理系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- “共享书角”图书借还管理系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 职称评审管理系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 智慧党建系统设计与实现_1i659--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- java学习平台--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 洞见研报云蝠智能(语音大数据及智能化客服解决方案供应商,南京星蝠科技有限公司)创投信息
- 基于labview的双音多频系统设计
- 基于Java的超市进销存系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 智慧学生校舍系统--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 光伏发电并网系统 matlab simulink整体仿真,波形如图,光伏板,MPPT控制boost,坐标变,锁相环,dq功率控制+解耦控制+电流内环电压外环,pwm调制,滤波器,此链接有2018a和
- 自习室预订系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- pytorch3D 为使用pytorch进行 3D 计算机视觉研究提供了高效、可重复使用的组件
- aarch64汇编指令集介绍