首页  编辑  

防止程序的多次运行

Tags: /超级猛料/OS.操作系统/Process.进程/   Date Created:

]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` 互斥对象(CreateMutex)应该是最好的方法

//项目文件

...

begin

 Application.initialation;

 if CreateMutex then begin

   Application.CreateForm(Form1, TForm1);

   Application.Run;

 end else

   DestroyMutex;

end;

//主窗体文件

...

implementation

var

 Mutex: hWnd;

function CreateMutex: Boolean;

var

 PrevInstHandle: THandle;

 AppTitle: PChar;

begin

 AppTitle := StrAlloc(100);

 StrPCopy(AppTitle, Application.Title);

 Result := True;

 Mutex := Windows.CreateMutex(nil, False, AppTitle);

 if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin

   Result := False;

   SetWindowText(Application.Handle, '');

   PrevInstHandle := FindWindow(nil, AppTitle);

   if PrevInstHandle <> 0 then begin

     if IsIconic(PrevInstHandle) then

       ShowWindow(PrevInstHandle, SW_RESTORE)

     else

       BringWindowToTop(PrevInstHandle);

     SetForegroundWindow(PrevInstHandle);

   end;

   if Mutex <> 0 then

     Mutex := 0;

 end;

 StrDispose(AppTitle);

end;

procedure DestroyMutex;

begin

 if Mutex <> 0 then

   CloseHandle(Mutex);

end;