我们有些程序是可以同时运行多个进程,典型的像Visual Studio.但有些就能一次运行一个进程.比如Outlook.那你可能会问啥时可以让它同时打开多个应用程序,啥时只能一个啊.这个主要看进程间是否独立,会不会有冲突,是否会时读写相同的文件.

如果你不写代码去做些处理默认肯定是可以让你同时运行多个进程的.那假如只能一次运行一个进程咋整呢?有两种常用的方式.

使用互斥(Mutex)

在处理线程同步的时候我们也会用到这东东.我们知道它是一个内核对象.系统中一次只能创建一个,如果你再次创建一个同名的会出错.我们就是利用这个原理来达到一次只运行一个进程.

在APP类中的InitInstance函数的开头添加如下代码.

HANDLE hMutex;

BOOL CMyApp::InitInstance(){

hMutex = CreateMutex(NULL,FALSE,_T("ArwenApp"));

if(GetLastError() == ERROR_ALREADY_EXISTS){ //如果已经存在同名的Mutex会得到这个错误.

CloseHandle(hMutex);

return FALSE;

}

//其他代码

}

CMyApp::~CMyApp(){ //析构函数中关闭互斥句柄,当然如果你不写也没事.关闭应用程序时系统也会自动给你Close,不过还是自己写上好点了.

CloseHandle(hMutex);

}

查找窗体是否存在

在APP类中的InitInstance函数的开头添加如下代码.

BOOL CMyApp::InitInstance(){

CWnd* pWndExist;

CWnd* pWndPopup;

pWndExist = CWnd::FindWindow(_T("ArwenAppClass"),NULL);

if(pWndExist) { //如果窗体存在说明已经打开了应用程序,下面的操作只是让程序更人性化.也可以简单的返回FALSE就行.

pWndPopup = pWndExist->GetLastActivePopup(); //获得打开的活动窗体

if(pWndPopup->IsIconic())

pWndPopup->ShowWindow(SW_RESTORE); //如果窗体被最小化了,restore它

pWndPopup->ShowWindow(SW_SHOW); //显示已经打开的窗体

pWndPopup->SetForegroundWindow(); //让窗体显示在最前面

return FALSE;

}

WNDCLASS wndcls;

memset(&wndcls, 0, sizeof(WNDCLASS));

wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

wndcls.lpfnWndProc = ::DefWindowProc;

wndcls.hInstance = AfxGetInstanceHandle();

wndcls.hIcon = LoadIcon(IDR_MAINFRAME);

wndcls.hCursor = LoadStandardCursor( IDC_ARROW );

wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);

wndcls.lpszMenuName = NULL;

wndcls.lpszClassName = _T("ArwenAppClass"); //注册一个窗体用来做判断是符存在已经打开的应用程序,除此之外该窗体没起啥作用

if(!AfxRegisterClass(&wndcls))

{

return FALSE;

}

CreateWindow(wndcls, _T("ArwenAppClass"), WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);

//其他代码

}
---------------------
作者:聪明的笨蛋
来源:CSDN
原文:https://blog.csdn.net/weiwenhp/article/details/8788086
版权声明:本文为博主原创文章,转载请附上博文链接!

C++ WINDOWS 防多开的更多相关文章

  1. 问题:C#控制台;结果:C#限制程序只能运行一個实例 (防多开)

    C# Console类的具体用法 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-08 这篇文章主要介绍C# Console类的具体用法,需要的朋友可以参考下   Console.Wr ...

  2. EasyPlayerPro(Windows)流媒体播放器开发之ffmpeg log输出报错

    EasyPlayerPro主要基于ffmpeg进行开发,在EasyPlayerPro开发过程中,曾遇到一个相对比较棘手的问题,该问题一般在播放不是很标准的流或者网络情况较差,容易出现丢帧的情况特别容易 ...

  3. Linux下tomcat启动成功但是Windows打不开tomcat网址

    前提条件: 1.Linux和Windows都可以相互ping通. 2.Linux下tomcat可以启动,并且在Linux下可以访问8080 出现的问题: 当我在Windows下访问时,无法连接或者出现 ...

  4. C#限制程序只能运行一個实例 (防多开)

    //方法一:只禁止多个进程运行 using System; using System.Collections.Generic; using System.Windows.Forms; namespac ...

  5. 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘

    [C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...

  6. DarkStone - 跨平台移动应用开发之 Flex 的崛起

    我的好友Ds 发布一个flex的消息.我帮忙转发 DarkStone - 跨平台移动应用开发之 Flex 的崛起 (2013-08-20 22:28:32)     此文章由 周戈 (DarkSton ...

  7. 基于ubuntu和windows连接

    对于ubuntu和centos安装软件是不一样的 对于ubuntu是  apt-get install  +软件名字 但是对于centos是 yum install +软件名字 所以ubunu远程连接 ...

  8. Windows Phone8开发工具包简述(转载)

    Windows Phone 软件开发包 (SDK) 8.0 可为您提供开发 Windows Phone 8 和 Windows Phone 7.5 应用和游戏所需的工具. 概述Windows Phon ...

  9. linux与windows回车换行符的区别

    转自:http://www.cnblogs.com/dartagnan/archive/2010/12/14/2003499.html “回车”(carriage return)VS  “换行”(li ...

随机推荐

  1. Mysql Window 解压版卸载

    windows如何彻底卸载mysql 如何彻底删除mysql 1.首先在windows服务中将mysql服务删掉,使用命令 sc delete mysql 2.在控制面板中卸载掉mysql. 3.清理 ...

  2. Git-简单的利用SourceTree提交代码(转载)

    http://www.cnblogs.com/shenyangxiaohuo/p/5239723.html

  3. ganglia使用nagios告警

    1.复制所需脚本到nagios的脚本目录,并设置权限  cp -fr ./ganglia-3.7.1/contrib/check_ganglia.py   /usr/local/nagios/libe ...

  4. work table a year

    近10个月~ 回顾一下最近写代码和博客~  4.5.6月份刷OJ~ 7月中旬入职滴滴,几乎放弃了博客... GitHub提交统计,主要集中在准备机试,刷了九度OJ~ GitLab in didi~ 很 ...

  5. java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=test]解决办法

    在进行简单的Junit单元测试时,测试一直报错: 先来看一下我的单元测试类: import org.junit.Test; import org.junit.runner.RunWith; impor ...

  6. Linux下查看设设置时间date命令

    查看时间 # date "+%Y_%m_%d  %H-%M-%S" 设置时间 #date -s "2018-05-17 09:51:50" //写入到硬件时钟 ...

  7. JAVA课程课后作业03之作业一

    作业:使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 代码: package TestJava; import java ...

  8. js中的 substr方法与substring方法 不同

    一个参数时: 二者同为  从 第参数个 开始截取,一直到str 末尾,并返回. 二个参数时: substr(a,b):  从第a个字符开始, 截取b个. substring(a,b):  从第a个字符 ...

  9. 网站favicon图标的显示问题

    今天在微信开发者工具发现一个错误,说是找不到favicon.ico这个文件. 这个就是标签式浏览器显示在页面title前面的小图标,移动端也没什么用,所以一直没在意,今天有空就研究了一下,发现还是有点 ...

  10. Integer 的 valueOf 方法 与 常量池(对 String Pool 的部分理解)

    举例: public class Test { @org.junit.Test public void intTest() { Integer t1 = 128; Integer t2 = 127; ...