Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#8

AW: Andere instanz beenden

  Alt 5. Okt 2018, 10:50
Delphi-Quellcode:
procedure TForm1.TerminateOtherInstances;
var
  szClass : pchar;
  sTitle : string;
  h : THandle;

begin
  sTitle := Application.Title;
  GetMem(szClass, 256);
  GetClassName(Application.Handle, szClass, 255);
  Application.Title := 'Dummy Caption';

  h := FindWindow(szClass, pchar(sTitle));
  while h <> 0 do
  begin
    PostMessage(h, WM_QUIT, 0, 0);
    Application.ProcessMessages;
    h := FindWindow(nil, pchar(sTitle));
  end;

  Application.Title := sTitle;
  FreeMem(szClass, 256);
end;
Das hat aber einen Haken: Wenn das zu beendende Programm nicht (mehr) auf WM_QUIT reagiert, bleibt auch jede weitere Instanz "hängen". Eventuell in der Schleife mitzählen und nach X Versuchen raus aus der Schleife, mit 'ner entsprechenden Fehlermeldung.

Und ggfls. in der Schleife eine Pause einfügen, damit die andere Instanz Zeit zum Beenden bekommt.

Eventuell ungefähr sowas?
Delphi-Quellcode:
function TForm1.TerminateOtherInstances(iVersuche : Integer; sMeldung : String) : Boolean;
var
  szClass : pchar;
  sTitle : string;
  h : THandle;
  iCount : Integer;
begin
  sTitle := Application.Title;
  iCount := 0;
  GetMem(szClass, 256);
  GetClassName(Application.Handle, szClass, 255);
  Application.Title := 'Dummy Caption';

  h := FindWindow(szClass, pchar(sTitle));
  Result := h = 0;
  while not Result and (iCount < iVersuche) do
  begin
    PostMessage(h, WM_QUIT, 0, 0);
    Application.ProcessMessages;
    iCount := iCount + 1;
    Sleep(1000);
    h := FindWindow(nil, pchar(sTitle));
    Result := h = 0;
  end;
  if iCount >= iVersuche then begin
    MessageDLG(sMeldung,mtError,[mbOk],0);
  end;
  Application.Title := sTitle;
  FreeMem(szClass, 256);
end;
  Mit Zitat antworten Zitat