用win32 API的CreateMutex来实现。
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 BOOL bInitialOwner, // 初始化互斥对象的所有者 LPCTSTR lpName // 指向互斥对象名的指针 );
例如:
var hMutex: HWND; //主窗口句柄 Ret: integer; // 最后的错误代码,用来检测是否是一个实例运行 begin //进程互斥,只允许一个实例运行 //主要根据第三个参数建立互斥指针,如果发现这个值已经存在,说明程序已经在运行,所以这个值必须具有唯一性 // 存在,则返回已有窗口句柄 hMutex := CREATEMUTEX(nil, FALSE, 'XXXXXX系统4B2LLLLMMDAAAAA-5DC34AF-12Z7-5TGB7U-9IJN0OK2445'); Ret := GETLASTERROR; //获得错误号,如果是多个实例,将会产生 183 这个值的错误号 if Ret = ERROR_ALREADY_EXISTS then //ERROR_ALREADY_EXISTS 表示进程已经存在 begin setActiveWindow(hMutex); //激活已有主窗口 Application.Terminate; // 当前程序终止 exit; //跳出当前代码块 end; end.