关于 让应用程序只运行一次 楼主:以下是一个兄弟的代码 var mutex:thandle; begin mutex:=CreateMutex(Nil,True,'OneInstance');//第三个参数随便写 if GetLastError<>ERROR_ALREADY_EXISTS then begin Application.CreateHandle; Application.CreateForm(TForm1,Form1);//form1改为你窗体的name Application.Run; end else ShowMessage('程序已经运行'); ReleaseMutex(mutex); end; -------------------------------------------------- 在程序主窗口的implementation之前写下 var hnd: THandle; 在程序主窗口的end.之前写下 initialization //比较好的防止程序再次执行语句 hnd := CreateMutex(nil, True, 'irgendwaseinmaliges'); if GetLastError = ERROR_ALREADY_EXISTS then Halt; 这是目前我发现的最有效防止再次运行程序的代码,楼上介绍的方法我也试过,但它会出现程序主窗口闪现现象. -------------------------------------------------- 网友回复: //...... private { Private declarations } public { Public declarations } end; var Form1: TForm1; //保存Mutex句柄 mHandle:THandle; PreviousInstanceWindow:HWnd; Project:String; AppName:String; implementation {$R *.dfm} initialization //定义自己的项目名称,作为要创建的互斥区名,最好有自己的特点以防止重复 Project:='RunOnlyOnce_MyProject'; //将lpMutexAttributes设为nil,bInitialOwner设为True(即本程序拥有该互斥区) mHandle:=CreateMutex(nil,True,PChar(Project)); if GetLastError=ERROR_ALREADY_EXISTS then //该互斥区已存在则表明已有本程序的另一个实例在运行 begin ShowMessage('已经有该程序在运行'); //保存程序标题 AppName:=Application.Title; //不显示本窗口 Application.ShowMainForm:=False; //改变程序标题,以使函数FindWindow找到的是前一个实例窗口 Application.Title:='destroy me'; //寻找前一个实例窗口句柄 PreviousInstanceWindow:=FindWindow(nil,PChar(AppName)); //已经找到 if PreviousInstanceWindow <> 0 then //假如该窗口最小化则恢复 if IsIconic(PreviousInstanceWindow) then ShowWindow(PreviousInstanceWindow,SW_RESTORE) else //假如程序在后台则将其放到前台 SetForegroundWindow(PreviousInstanceWindow); //中止本实例 Application.Terminate; end; finalization //该互斥区对象仍存在则关闭对象 if mHandle <> 0 then CloseHandle(mHandle); end.