有时候需要防止程序启动多个实例,通过信号量可以实现这个简单的机制。
BOOL checkexists(HANDLE hSem)
{
hSem = CreateSemaphore(NULL, 1, 1, _T("Global\\TInitialSem"));
if (hSem)
{
if (ERROR_ALREADY_EXISTS == GetLastError())
{
HWND hWndPrev = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
while (::IsWindow(hWndPrev))
{
if (::GetProp(hWndPrev, _T("TSTRINGID")))
{
//if minimized ,show the windows
if (::IsIconic(hWndPrev))
::ShowWindow(hWndPrev, SW_RESTORE);
//active windows
::SetForegroundWindow(hWndPrev);
return TRUE; //exit
} //search next windows
hWndPrev = ::GetWindow(hWndPrev, GW_HWNDNEXT);
}
}
}
::SetProp(GetConsoleWindow(), _T("TSTRINGID"), (HANDLE)1);
return FALSE;
}
使用方法,声明一个句柄,函数返回值为TRUE的时候,才可以继续启动程序,否则提前退出。
可以在程序启动入口处,添加如下代码:
HANDLE hsem = INVALID_HANDLE_VALUE;
if (checkexists(hsem))
{
CloseHandle(hsem);
return iRet; //启动失败返回值
}
启动成功后,程序推出前,需要关闭声明的句柄。