C#中使用互斥锁Mutex解决PC端程序多开的问题

简介

防止PC端程序多开

前言

昨天,偶然从好朋友老王哪里得知,他的电脑居然可以同时上两个微信号。这倒是引起了我的好奇,他告诉我是这样做的,他写了一个批处理文件,.

TASKKILL /F/IM WeChat.exe
start " " "E:\Program Files (x86)\Tencent\WeChat\WeChat.exe"
start " " "E:\Program Files (x86)\Tencent\WeChat\WeChat.exe"

然后直接双击批处理文件,果然能启动两个微信进程,我在想我们能不能把这样的漏洞补上呢, 所以我自己写了一个程序,首先我们要写程序之前要明白,怎么控制程序不能打开两次,做到系统级别的互斥, 可能好多同学说,线程同步问题我倒是随便解决,但是进程同步的问题该怎么解决呢,如果大家对基础比较熟悉的话,就会知道互斥锁Mutex能够解决这样的问题,我们看一下官方文档:

C#中解决PC端程序多开的问题

我是这样理解的

•initiallyOwned: 如果initiallyOwned为true,互斥锁的初始状态就是被所实例化的线程所获取,否则实例化的线程处于未获取状态。•name:该互斥锁的名字,在操作系统中只有一个命名为name的互斥锁mutex,如果一个线程得到这个name的互斥锁,其他线程就无法得到这个互斥锁了,必须等待那个线程对这个线程释放。•createNew:如果指定名称的互斥体已经存在就返回false,否则返回true。

所以我在我写的demo程序的入口处。写了这样一段代码

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

我们把程序生成,打开我们的程序两次,第一次能够正常打开,第二次就显示该程序已打开了,

C#中解决PC端程序多开的问题

然后我们修改一下多开的批处理文件


TASKKILL /F/IM WindowsFormsApp1.exe

start " " "E:\02_blibli\wenz\32Mutex\WindowsFormsApp1\bin\Debug\WindowsFormsApp1.exe"

start " " "E:\02_blibli\wenz\32Mutex\WindowsFormsApp1\bin\Debug\WindowsFormsApp1.exe"

发现我们的程序还是只能打开一次,并不能多开,那微信为什么能多开呢?是微信的开发故意留的这样一个漏洞还是技术层面的呢?我还是想不通;但是从技术层面来说,他们有没有可能,是在启动程序的是时候去遍历的进程呢,由于两个程序打开时间间隔太短,以至于第一个程序还没有进程的时候,就打开第二个了,所以就能多开?我只能这样瞎猜,如果有知道的可以告诉我。

我今天就给大家讲了使用互斥锁解决程序多开的问题!