Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi de Program Bir defa Çalışsın
#11

var
 Mutex: THandle;


function KillApp(const sCapt: PChar) : boolean;
var
 AppHandle:THandle;
 Tid, Pid: integer;
begin
 AppHandle:=FindWindow(Nil, sCapt);
 Tid := GetWindowThreadProcessid(AppHandle, @Pid);
 AppHandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
 TerminateProcess(AppHandle,0);
end;

begin
 Application.Initialize;
 Mutex := CreateMutex(nil , False, pchar(ExtractFileName(Application.ExeName)));
 if GetLastError = ERROR_ALREADY_EXISTS then
 begin
   if messagedlg('Açık olan programı kapatmak istiyormusunuz?', mtError, mbOKCancel, 0) = 1 then
     KillApp('Program')
   else
      ExitProcess(0);
  end;

 Application.CreateForm(TfrmMain, frmMain);
 Application.Run;
end.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#12
Wink 
(14-01-2022, Saat: 19:52)QuAdR Adlı Kullanıcıdan Alıntı:

var
 Mutex: THandle;


function KillApp(const sCapt: PChar) : boolean;
var
 AppHandle:THandle;
 Tid, Pid: integer;
begin
 AppHandle:=FindWindow(Nil, sCapt);
 Tid := GetWindowThreadProcessid(AppHandle, @Pid);
 AppHandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
 TerminateProcess(AppHandle,0);
end;

begin
 Application.Initialize;
 Mutex := CreateMutex(nil , False, pchar(ExtractFileName(Application.ExeName)));
 if GetLastError = ERROR_ALREADY_EXISTS then
 begin
   if messagedlg('Açık olan programı kapatmak istiyormusunuz?', mtError, mbOKCancel, 0) = 1 then
     KillApp('Program')
   else
      ExitProcess(0);
  end;

 Application.CreateForm(TfrmMain, frmMain);
 Application.Run;
end.

 Elinize Sağlık.. Wink
Cevapla
#13
@QuAdR hocam tam çözemedim..

Bir yerde yanlış yapıyorum ama nerede.. Project source kısmında kullandım kodları..

Proje açık ise confirm alıyor okey. Fakat kapat dediğimde hiç bir işlem yapmıyor.. Killapp kısmı çalışmıyor..
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#14
(30-01-2022, Saat: 21:39)mcuyan Adlı Kullanıcıdan Alıntı: @QuAdR hocam tam çözemedim..

Bir yerde yanlış yapıyorum ama nerede.. Project source kısmında kullandım kodları..

Proje açık ise confirm alıyor okey. Fakat kapat dediğimde hiç bir işlem yapmıyor.. Killapp kısmı çalışmıyor..

oradaki kod henüz hiç bir form create edilmeden çalışmakta, bu sebeple killapp fonksiyonda belirtilen scaption alanı
yazabileceğiniz bir değere ihtiyaç var(örneğin; form1.caption), bu sebeplede kill çalışmaz,

HWND FindWindowA(
  [in, optional] LPCSTR lpClassName,
 [in, optional] LPCSTR lpWindowName
);

caption yerine paramstr(0) ile full path karşılaştırılması yapılarak terminate edilmesi daha iyi olabilir.

AppHandle değerine (-1) bakılmakdan openprocess yapılmasıda yanlış olmuş.
Cevapla
#15
Konunun başlığı ile alakalı, içeriği ile alakasız ama katkı olsun diye eklemek isterim...

uses shellapi;

procedure TForm1.FormShow(Sender: TObject);
var atom : integer;
CRLF : string;
begin
   if GlobalFindAtom('THIS_IS_SOME_OBSCUREE_TEXT') = 0 then
   atom := GlobalAddAtom('THIS_IS_SOME_OBSCUREE_TEXT')

else
begin
   CRLF := #10 + #13;
   ShowMessage('Bu uygulama her Windows oturumunda yalnızca bir kere çalışır.' + CRLF +
   'Programı tekrar çalıştırmak için Windowsu restart edin. ');
   Close;

end;
end;
Cevapla
#16
Aslında benim tam olarak istediğim şu: Ben yeni uygulamayı açarken: Uygulama zaten açık eski uygulama kapatılsın mı sorusu.. Bunun içibde eski açık olan uygulamanın PID değerini bulmak gerekiyor sanırım.. onu kill etmek lazım.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#17
//uses TLHelp32;

var
myPID: THandle;
Mutex: THandle;

function GetPIDbyProcessName(processName: String): integer;
var
  tHnd: THandle;
  pEntry: tProcessEntry32;
begin
  Result := 0;
  tHnd := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
  pEntry.dwSize := SizeOf(pEntry);
  if Process32First(tHnd, pEntry) then
  begin
    while Process32Next(tHnd, pEntry) do
    if (pEntry.szExeFile = processName) and  (pEntry.th32ProcessID <> GetCurrentProcessId) then
    begin
      Result := pEntry.th32ProcessID;
      Break;
    end;
  end;
  CloseHandle(tHnd);
end;


procedure KillApp(PidApp: integer );
var
 AppHandle:THandle;
begin
  AppHandle := OpenProcess(PROCESS_ALL_ACCESS,False,PidApp);
  if AppHandle > 0 then
  TerminateProcess(AppHandle,0);
  CloseHandle(AppHandle)
end;

begin
Application.Initialize;
Mutex := CreateMutex(nil , False, pchar(ExtractFileName(Application.ExeName)));
if GetLastError = ERROR_ALREADY_EXISTS then
begin
  if messagedlg('Açık olan programı kapatmak istiyormusunuz?', mtError, mbOKCancel, 0) = 1 then
   begin
      myPID := GetPIDbyProcessName(ExtractFileName(ParamStr(0)));      
      if myPID > 0 then
      begin
        KillApp(myPID)
      end;
   end
  else
     ExitProcess(0);
end;

Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Örnek Delphi x64 Inline Assemblier Fonksiyonları PROGRAMADOR35 11 5.175 10-08-2021, Saat: 12:46
Son Yorum: maroonka
  Delphi de ADOConnection kullanarak SQL Server' a Bağlanma Procedure nuheroglu 4 2.841 19-05-2021, Saat: 16:44
Son Yorum: midorun87
Thumbs Up [Delphi] Yeni Başlayanlar İçin Güzel Kaynak Halil Han BADEM 3 4.882 27-12-2020, Saat: 23:28
Son Yorum: Hayati
  Delphi Çift Yönlü Bağlı Liste Ekleme,Silme,Listeleme,Arama narkotik 0 1.731 26-11-2018, Saat: 22:05
Son Yorum: narkotik
  Delphi Bağlı Liste Ekleme,Silme,Listeleme narkotik 1 2.434 21-10-2018, Saat: 14:59
Son Yorum: sabanakman



Konuyu Okuyanlar: 1 Ziyaretçi