在 InitInstance() 中建立具名互斥體,若 GetLastError() 回傳 ERROR_ALREADY_EXISTS 即表示已有實例在執行,隨即終止新啟動的程序。
// By cryfish
HANDLE hMutexOneInstance = CreateMutex(NULL, TRUE, _T("PreventSecondInstance"));
BOOL bFound = FALSE;
if (GetLastError() == ERROR_ALREADY_EXISTS)
bFound = TRUE;
if (hMutexOneInstance)
ReleaseMutex(hMutexOneInstance);
if (bFound)
{
::AfxMessageBox(_T("程式已在執行中"));
return FALSE;
}
CreateMutex 參數:NULL 安全屬性、TRUE 初始擁有權、唯一名稱字串。GetLastError() 判斷是否為既有實例。ReleaseMutex 釋放所有權再結束程式。此法簡單可靠,適用於所有 Win32/MFC 應用程式。