只运行一个实例的方法
在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
只运行一个实例的方法相关推荐
- 转:让程序只运行一个实例的四种方法
先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...
- 只运行一个实例的写法
有时我们需要只允许运行应用程序的一个实例,当进程启动时,如果发现应用程序的一个实例在运行,就自动停止运行.我们通常通过Mutex互斥体在Main函数中实现,通常的写法是: [STAThread] st ...
- 让Java程序只运行一个实例
一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...
- Qt应用程序只运行一个实例
在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...
- 只允许运行一个实例的方法
查找窗口法 TCHAR wndName = ["blahblah"]; hWnd = FindWindow(NULL, wndName); if(hwnd == 0) // 没找到 ...
- linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量
//包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...
- c#,Winform同一系统中只运行一个实例。
代码 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; na ...
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例
static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] ...
最新文章
- 统计文件种类数+获取子shell返回值的其它方法
- “复制粘贴”发明人,竟是物理学博士转行做程序媛!
- 太阳光是平行光吗_科普文系列活动 || 奇妙的光现象
- 【视频课】模型优化拆分!分别学习模型剪枝与模型量化理论与实践
- annotationdriven
- staf工作笔记-扩展stax官方实例的补坑说明
- 深度学习笔记(13) Softmax分类
- 高压缩比 压缩软件 linux,Linux 下最为人熟知的归档/压缩工具
- Effective Java (7) - 避免终止方法
- feign整合hystrix开启hystrix后启动报错_Spring Cloud进阶之路 | 六:断路器(hystrix)...
- 麦马计算机专业对化学的要求,2018麦克马斯特大学最新入学要求+热门专业全解析...
- ggplot2作图4
- shell脚本练习实例
- 【笔记】《凤凰项目》读书笔记
- Linux7清空回收站,centos rm回收站
- 极米H3S和坚果J10S对比,5000元投影仪到底哪个好?
- asp.net928-研究生报名系统
- 浅谈鸽巢原理的证明和简单应用
- 520 送女朋友礼物大全 (推荐男生收藏)
- druid配置:回收线程remove-abandoned使用踩坑