在VC++ 中编程中,只运行一个实例的方法主要有两类:

1 遍历当前的所有窗口,查找相同的实例。为了便于查找,一般要事先设一个查找标志。

2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例。

在发现重复运行时,一般还有一个任务,就是激活已经存在的窗口。

一、 第一类方法的实现

下面是一个具体的例子,下图是示例代码运行的情况。

部分关键代码

1、在App的InitInstance()中枚举所有窗口,查找本程序实例

 1 HWND oldHWnd = NULL;
 2
 3 EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);    //枚举所有运行的窗口
 4
 5 if(oldHWnd != NULL)
 6
 7 {
 8
 9 AfxMessageBox("本程序已经在运行了");
10
11 ::ShowWindow(oldHWnd,SW_SHOWNORMAL);          //激活找到的前一个程序
12
13 ::SetForegroundWindow(oldHWnd);                //把它设为前景窗口
14
15 return false;                                  //退出本次运行
16
17 }

2、添加EnumWndProc窗口过程函数://通过自定义的属性名查找同类实例窗口

 1 CString  g_szPropName = "Your Prop Name";   //自己定义一个属性名
 2
 3 HANDLE   g_hValue = (HANDLE)1;         //自己定义一个属性值
 4
 5
 6
 7 BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
 8
 9 {
10
11 HANDLE h = GetProp(hwnd,g_szPropName);
12
13 if( h == g_hValue)
14
15 {
16
17 *(HWND*)lParam = hwnd;
18
19 return false;
20
21 }
22
23 return true;
24
25 }

3、在主窗口的 OnInitDialog()中添加属性 //设置窗口属性

1 SetProp(m_hWnd,g_szPropName,g_hValue);

2丶第二种方法:

控制台下:

 1 HANDLE Mutex;
 2
 3     Mutex = CreateMutex(NULL, TRUE, "me");
 4
 5      if(GetLastError() == ERROR_ALREADY_EXISTS)
 6
 7     {
 8
 9     cout << "only one instance can run!" << endl;
10
11      return 1;
12
13     }
14
15     else
16
17     {
18
19        ReleaseMutex(Mutex);
20
21     }

MFC下:

 1 BOOL CtestInfoApp::InitInstance()
 2
 3 {
 4
 5     HANDLE Mutex;
 6
 7     Mutex = CreateMutex(NULL, TRUE, "me");
 8
 9     if(GetLastError() == ERROR_ALREADY_EXISTS)
10
11     {
12
13        AfxMessageBox("only one instance can run!");
14
15        return 0;
16
17     }
18
19     else
20
21     {
22
23        ReleaseMutex(Mutex);
24
25     }
26
27 …
28
29 }

转载于:https://www.cnblogs.com/wind-net/archive/2012/08/29/2661709.html

只运行一个实例的方法相关推荐

  1. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

  2. 只运行一个实例的写法

    有时我们需要只允许运行应用程序的一个实例,当进程启动时,如果发现应用程序的一个实例在运行,就自动停止运行.我们通常通过Mutex互斥体在Main函数中实现,通常的写法是: [STAThread] st ...

  3. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  4. Qt应用程序只运行一个实例

    在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...

  5. 只允许运行一个实例的方法

    查找窗口法 TCHAR wndName = ["blahblah"]; hWnd = FindWindow(NULL, wndName); if(hwnd == 0) // 没找到 ...

  6. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

  7. c#,Winform同一系统中只运行一个实例。

    代码 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; na ...

  8. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

  9. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

    static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   ...

最新文章

  1. 统计文件种类数+获取子shell返回值的其它方法
  2. “复制粘贴”发明人,竟是物理学博士转行做程序媛!
  3. 太阳光是平行光吗_科普文系列活动 || 奇妙的光现象
  4. 【视频课】模型优化拆分!分别学习模型剪枝与模型量化理论与实践
  5. annotationdriven
  6. staf工作笔记-扩展stax官方实例的补坑说明
  7. 深度学习笔记(13) Softmax分类
  8. 高压缩比 压缩软件 linux,Linux 下最为人熟知的归档/压缩工具
  9. Effective Java (7) - 避免终止方法
  10. feign整合hystrix开启hystrix后启动报错_Spring Cloud进阶之路 | 六:断路器(hystrix)...
  11. 麦马计算机专业对化学的要求,2018麦克马斯特大学最新入学要求+热门专业全解析...
  12. ggplot2作图4
  13. shell脚本练习实例
  14. 【笔记】《凤凰项目》读书笔记
  15. Linux7清空回收站,centos rm回收站
  16. 极米H3S和坚果J10S对比,5000元投影仪到底哪个好?
  17. asp.net928-研究生报名系统
  18. 浅谈鸽巢原理的证明和简单应用
  19. 520 送女朋友礼物大全 (推荐男生收藏)
  20. druid配置:回收线程remove-abandoned使用踩坑

热门文章

  1. systematic literature review how to write it?
  2. 三个免费图片网站:特别适合场景图
  3. js 如何实现bind
  4. 我的第一个Github项目上线了
  5. NO.152 移动互联时代如何做企业营销
  6. 赛诺朗基智能安全保障平台——安全着你的安全!
  7. SQL Server 日志传送[转载]
  8. IT人士运动方式选择建议
  9. 嵌入式Linux中I2C设备驱动程序的研究与实现
  10. 使脚本和CSS在IE8中兼容