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); //删除窗口属性,标记