調用 CreateMutex 創建一個全局唯一名稱的互斥對象。若已存在同名互斥體,GetLastError 返回 ERROR_ALREADY_EXISTS,說明程序已在運行,直接退出。
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
const char* szAppName = "OnlyOneApp";
HANDLE hMutex = CreateMutex(NULL, FALSE, szAppName);
if (hMutex != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(NULL, TEXT("程序已在運行。"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
CloseHandle(hMutex);
return -1;
}
}
else
{
MessageBox(NULL, TEXT("創建互斥體失敗。"), TEXT("錯誤"), MB_OK | MB_ICONERROR);
return -1;
}
// 正常運行邏輯...
MessageBox(NULL, TEXT("首次啟動。"), TEXT("提示"), MB_OK);
CloseHandle(hMutex);
return 0;
}
program OnlyOne;
uses
Windows,
Forms,
uMain in 'uMain.pas' {FormMain};
{$R *.res}
var
hAppMutex: THandle;
begin
Application.Initialize;
// 創建互斥體,必須在 Application.Initialize 之後
hAppMutex := CreateMutex(nil, False, 'OnlyOneApp');
if (hAppMutex = 0) then
begin
MessageBox(0, '創建互斥體失敗!', '錯誤', MB_OK + MB_ICONERROR);
Exit;
end;
// 檢查是否已存在
if (hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS) then
begin
MessageBox(0, '程序已在運行!', '提示', MB_OK + MB_ICONINFORMATION);
CloseHandle(hAppMutex);
Exit;
end;
Application.CreateForm(TFormMain, FormMain);
Application.Run;
// 程序結束時釋放
CloseHandle(hAppMutex);
end.
CreateMutex 調用需在 Application.Initialize 之後,CloseHandle 在 Application.Run 之後。uses 子句中 Windows 必須在 Forms 之前。