MFC中应用程序只允许运行一个实例方法二与三
来源:互联网 发布:软件租赁合同 编辑:程序博客网 时间:2024/04/30 06:35
在VC++ 中编程中,只运行一个实例的方法主要有两类:
1 遍历当前的所有窗口,查找相同的实例。为了便于查找,一般要事先设一个查找标志。
2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例。
在发现重复运行时,一般还有一个任务,就是激活已经存在的窗口。
一、 第一类方法的实现
下面是一个具体的例子,下图是示例代码运行的情况。
部分关键代码
1、在App的InitInstance()中枚举所有窗口,查找本程序实例
HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚举所有运行的窗口
if(oldHWnd != NULL)
{
AfxMessageBox("本程序已经在运行了");
::ShowWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一个程序
::SetForegroundWindow(oldHWnd); //把它设为前景窗口
return false; //退出本次运行
}
2、添加EnumWndProc窗口过程函数://通过自定义的属性名查找同类实例窗口
CString g_szPropName = "Your Prop Name"; //自己定义一个属性名
HANDLE g_hValue = (HANDLE)1; //自己定义一个属性值
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
HANDLE h = GetProp(hwnd,g_szPropName);
if( h == g_hValue)
{
*(HWND*)lParam = hwnd;
return false;
}
return true;
}
3、在主窗口的 OnInitDialog()中添加属性 //设置窗口属性
SetProp(m_hWnd,g_szPropName,g_hValue);
二、 第二类方法
利用互斥对象的例子
//首先在InitInstance() 函数中创建一个同步对象
//如果 GetLastError() 返回ERROR_ALREADY_EXISTS就表明存在一个应用实例了
//返回false取消
// 创建同步对象
hMutexOneInstantance=CreateMutex(NULL,TRUE,_T("PreventSecondInstance"));
if(GetLastError()==ERROR_ALREADY_EXISTS) bFound=TRUE;
if(hMutexOneInstantance) ReleaseMutex(hMutexOneInstantance);
if (bFound==TRUE)
{ ::AfxMessageBox("You have Run one");
return false;
}
这里没有进行激活已有实例的操作。
- MFC中应用程序只允许运行一个实例方法二与三
- MFC中应用程序只允许运行一个实例方法一
- MFC中应用程序只允许运行一个实例
- MFC中应用程序只允许运行一个实例
- MFC中应用程序只允许运行一个实例
- MFC中应用程序只允许运行一个实例
- MFC中应用程序只允许运行一个实例
- MFC中应用程序只允许运行一个实例
- MFC 对话框只允许一个实例运行
- 只允许运行一个实例的三种方法
- 只允许一个实例运行的方法
- 只允许运行一个实例的方法
- mfc应用程序只运行一个实例
- MFC:只允许产生一个应用程序实例的具体实现
- 只允许一个应用程序实例
- 只允许运行一个实例
- 只允许运行一个实例
- delphi程序只允许运行一个实例的三种方法
- HTTP Status 404 - No result defined for action …… and result input。
- 扩展Edit Box控件的功能
- MFC中应用程序只允许运行一个实例方法一
- java正则除去img中的height和width保留src属性
- 类参数
- MFC中应用程序只允许运行一个实例方法二与三
- 操作系统的电源相关消息
- 为什么你不能把一个FILETIME结构当成一个__int64
- 2011-12-06
- 查找/替换对话框CFindReplaceDialog的使用
- 向量求导法则--前导不变,后导转置
- IP地址控件CIPAddressCtrl类的使用
- Liang-Barsky直线裁剪算法的实现
- 简单工厂模式——Factory