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;