MFC只运行一个实例窗口

来源:互联网 发布:windows字体库样式 编辑:程序博客网 时间:2024/06/05 05:38

1. 概述

在编写MFC程序的时候,有些时候需要程序只能运行一个实例。需要实现这样功能,首先要阻止多个实例的运行,并将运行了的实例放置到最前面。本篇文章中采用互斥量来实现。

2. 实现

在InitInstance()对应的App类中添加一个互斥量句柄m_hMutex。之后在InitInstance()的最前面添加如下代码
//只运行一个实例m_hMutex = CreateMutex(NULL, FALSE, _T("My_App"));if (GetLastError() == ERROR_ALREADY_EXISTS)//检查互斥量对象名称是否已经存在{CWnd* pDesktopWnd = CWnd::GetDesktopWindow();//寻找桌面窗口CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);//获取桌面上的窗口while (pWnd != NULL)//从桌面窗口上的窗口开始,一直寻找窗口,判断是不是已经存在了{if (::GetProp(pWnd->m_hWnd, m_pszExeName))//判断找到的窗口是不是需要找到的程序窗口,也就是自身{pWnd->SetForegroundWindow();//将找到的窗口放置在最前面break;//return FALSE;//返回}pWnd = pWnd->GetWindow(GW_HWNDNEXT);//获取下一个窗口}MessageBox(NULL, _T("已经有一个实例在运行了"), _T("提示"), MB_OK);return FALSE;}
在XXXDlg类中添加ON_CREATE响应函数,添加语句
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)NULL);//添加窗口属性、标记
在XXXDlg类中添加ON_DESTROY响应函数,添加语句
::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);//删除窗口属性,标记


原创粉丝点击