Aslında bu konu formda defalarca ifade edildi ve bir arama yapıldığı zaman onlarca cevap bulunacaktır. Burada konu ile ilgili son bir toparlama bilgi vermek için bu yazıyı yazmak istedim.
Genelde bir program çalışıyorsa 2. defa çalışmasını engellemek için en sık karşılaşılan yöntem Mutex oluşturmak ve bunu kullanmak olacaktır. Progamımızın .dpr dosyasına (<-.dpr açıklaması için not eklendi):
Kod: Tümünü seç
// uses Windows, SysUtils, Dialogs
var hMyMutex : tHandle;
begin
hMyMutex := CreateMutex(nil,FALSE,'Deneme');
if (hMyMutex <> 0) then try
if (GetLastError <> ERROR_ALREADY_EXISTS) then begin
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end else ShowMessage ('Program zaten çalışıyor');
finally
CloseHandle (hMyMutex);
end else ShowMessage ('Program tanım oluşturmada hata : ' + IntToStr(GetLastError));
end.
Kod: Tümünü seç
function WinClassName(const Handle:THandle):String;
var Buffer: array[0..MAX_PATH] of Char;
begin
Windows.GetClassName(Handle,Buffer,MAX_PATH);
Result:=Buffer;
end;
Kod: Tümünü seç
// uses Windows, SysUtils, Dialogs
const SaatCaption='Saat';
var ProgHwnd:THandle;
begin
ProgHwnd:=FindWindow(PChar(String(TFormSaat.ClassName)),SaatCaption);
{ProgHwnd:=FindWindow(nil,SaatCaption); {<-bu da iş görür ancak Caption çakışmasını engellemek gerek :) }
if ProgHwnd=0 then begin
Application.Initialize;
Application.CreateForm(TFormSaat, FormSaat);
FormSaat.Caption:=SaatCaption;
{FormSaat formu tasarım anında başlığı boş olmalıdır, yoksa delphi ekranı açıkken sorun oluşabilir. ProgHwnd:=FindWindow... kodu delphi tasarımında olan formu bularak istenmeyen bir durum oluşturabilir.}
Application.Run;
end else begin
SetForegroundWindow(ProgHwnd); //<-Öne getir
end;
end.
------------------------------------------------------------------------------------------
Not:Projede çalışılan formların oluşturulduğu
Kod: Tümünü seç
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.