http://www.cctry.com/thread-38070-1-3.html
1.创建新节法
#pragma data_seg("Shared")
HWND hWnd=NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,RWS")
初始化函数中:
if (hWnd==NULL)
{
hWnd=m_hWnd;
}
else
{
AfxMessageBox(_T("只允许运行一个实例!"));
::SetForegroundWindow(hWnd);
ExitProcess(0);
}
2.互斥体法
缺点是无法激活旧窗口,可以用CreateMutex,CreateEvent,OpenMutex等API实现
hObject=CreateMutex(NULL,FALSE,_T("互斥体"));
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("只允许运行一个实例!"));
ExitProcess(0);
}
3.查找窗口标题法
1.FindWindow
初始化函数中
hObject=CreateMutex(NULL,FALSE,_T("互斥体"));
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("只允许运行一个实例!"));
ExitProcess(0);
}
2.EnumWindows
BOOL CALLBACK MyEnumWndProc(HWND hwnd,LPARAM lParam)
{
TCHAR szCaption[256]={0};
GetWindowText(hwnd,szCaption,256);
if (_tcscmp(_T("EnumWindows单实例"),szCaption)==0)
{
AfxMessageBox(_T("只允许运行一个实例!"));
::SetForegroundWindow(hwnd);
ExitProcess(0);
}
return TRUE;
}
初始化函数中
EnumWindows(MyEnumWndProc,NULL);
SetWindowText(_T("EnumWindows单实例"));
3.GetWindow
TCHAR szCaption[MAX_PATH]={0};
HWND hWnd=::GetWindow(::GetDesktopWindow(), GW_CHILD);
while(hWnd!=NULL)
{
::GetWindowText(hWnd,szCaption,MAX_PATH);
if (_tcscmp(_T("GetWindow单实例"),szCaption)==0)
{
AfxMessageBox(_T("只允许运行一个实例!"));
::SetForegroundWindow(hWnd);
ExitProcess(0);
}
hWnd=::GetWindow(hWnd, GW_HWNDNEXT);
}
SetWindowText(_T("GetWindow单实例"));