我们有些程序是可以同时运行多个进程,典型的像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. 解决Postgres无法连接的问题

    错误信息如下: could not connect to server: Connection refused Is the server running on host host.domain.co ...

  2. 局域网ARP攻击防护

    通过借助一些安全软件来实现局域网ARP检测及防御功能. A.电脑管家 电脑管家--工具箱--下载ARP防火墙模块 不支持window2003 B.服务器安全狗 Windows版下载:http://fr ...

  3. k8s(3)-Pods和Nodes的概念

    Pod是什么? 在前面创建部署时,Kubernetes创建了一个Pod来托管您的应用程序实例.Pod是一个Kubernetes抽象,表示一组一个或多个应用程序容器(如Docker或rkt),以及这些容 ...

  4. 三、Sql Server 基础培训《进度3-是否使用外键(知识点学习)》

    学习作业3: 问题1:你觉得外键有哪些适用情况?哪些不适用情况?   问题2:本次实战案例,由你来架构,你觉得有必要建立外键吗? 说明你的理由?     ======================= ...

  5. 【转】Android 为什么 dp2px 或 px2dp 公式需要加 0.5f

    转自:http://blog.csdn.net/changcsw/article/details/52440543 网上 dp2px 和 px2dp 公式: public static int px2 ...

  6. react material-ui 添加jss插件

    jss.config.js import { create } from "jss"; import preset from "jss-preset-default&qu ...

  7. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  8. inner_product

    版本1: template < class InputIterator1, class InputIterator2, class T> T inner_product(InputIter ...

  9. [No0000197]Windows用户都应该知道的运行命令

    通过"运行"命令,运行Windows丰富工具的方法.如果您知道工具或任务的相应"运行"命令,那么您就知道访问所述工具或任务的最快方法. 以下是我们最喜欢的Run ...

  10. [redis] redis cli的学习记录

    文档: https://redis.io/topics/rediscli help命令: The command can be used in two forms: . help @<categ ...