AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

anderes Programm beenden

Ein Thema von Gambit · begonnen am 9. Feb 2005 · letzter Beitrag vom 22. Feb 2019
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

anderes Programm beenden

  Alt 9. Feb 2005, 22:13
Hallo,
ich möchte eine .exe Datei bei Programmstart meines Programms starten und bei Beenden meines Programms auch wieder mit beenden.
Ein anderes Programm aus meinem Programm heraus starten krieg ich ja noch hin, aber wie beende ich es denn wieder?

Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: anderes Programm beenden

  Alt 9. Feb 2005, 22:59
Du kannst z.B. an das Fensterhandle eine WM_CLOSE Nachricht schicken. Besser wäre eine SC_CLOSE Nachricht. Oder eine PostQuitMessage an den Thread. Und zu allerletzt kannst du das Programm brutal mit TerminateProcess beenden.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#3

Re: anderes Programm beenden

  Alt 10. Feb 2005, 09:52
Das Teil läuft aber nur im Tray ohne ein Fenster. Ein Fensterhandle habe ich da wohl nicht, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#4

Re: anderes Programm beenden

  Alt 10. Feb 2005, 13:44
Zitat von Gambit:
Ein Fensterhandle habe ich da wohl nicht, oder?
Da wird es auch ein Fensterhandle geben.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#5

Re: anderes Programm beenden

  Alt 11. Feb 2005, 18:48
Also folgendermaßen funzt es jetzt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := Sizeof(TStartupInfo);
  if CreateProcess(nil, // Anwendungsname
                   PChar(edit1.text), // Parameter
                   nil, // Security
                   nil, // Security
                   False,
                   NORMAL_PRIORITY_CLASS, // Priorität
                   nil, // Environment
                   PChar(edit2.text), // Verzeichnis
                   StartupInfo,
                   ProcessInfo) then begin
  end else Showmessage('Fehler!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TerminateProcess(ProcessInfo.hProcess,0);
  Showmessage('Prozess beendet!');
end;
Aber wie müsste denn meine Anweisung in Button2Click ausehen, wenn ich den Prozess "kontrolliert" beenden möchte?

Gruß

Gambit
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#6

Re: anderes Programm beenden

  Alt 11. Feb 2005, 20:26
@Sprint:

Habe mal versucht dein Beispiel, welches du hier im Forum mal gepostet hattest auf meines umzusetzten, funzt damit aber nicht, ich muss wohl auf terminateProcess zurückgreifen und die Keule nehmen...

Hier noch Mal dein Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;
  List: TList;
  ProcessId: DWORD;
  AppHWnd: HWND;
  I: Integer;
begin

  AppHWnd := 0;
  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_SHOW;
  if CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
    List := TList.Create;
    try
      if EnumWindows(@EnumWindowsProc, Longint(List)) then
      begin
        for I := 0 to List.Count - 1 do
          if GetWindowThreadProcessId(HWND(List.Items[I]), @ProcessId) <> 0 then
            if ProcessId = PI.dwProcessId then
            begin
              AppHWnd := HWND(List.Items[I]);
              Break;
            end;
        if IsWindow(AppHWnd) then
        begin
          ShowMessage('Fensterhandle ist $' + IntToHex(AppHWnd, 8));
          SendMessage(AppHWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
        end;
      end;
    finally
      List.Free;
    end;
  end;

end;
Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#7

Re: anderes Programm beenden

  Alt 11. Feb 2005, 20:28
Zitat von Gambit:
Aber wie müsste denn meine Anweisung in Button2Click ausehen, wenn ich den Prozess "kontrolliert" beenden möchte?
Für ein sauberes beenden, muss man paar Zeilen mehr schreiben.
Delphi-Quellcode:
var
  AppPID: DWORD;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin

  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    AppPID := PI.dwProcessId;
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;

end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

  procedure Wait(MilliSeconds: DWORD);
  var
    Stop: DWORD;
  begin
    Stop := GetTickCount + MilliSeconds;
    while Stop > GetTickCount do
    begin
      Sleep(100);
      Application.ProcessMessages;
    end;
  end;

var
  List: TList;
  I: Integer;
  ProcessId: DWORD;
  ThreadId: DWORD;
  ProcessHandle: THandle;
  ExitCode: DWORD;
begin

  if AppPID <> 0 then
  begin
    List := TList.Create;
    try
      EnumWindows(@EnumWindowsProc, LPARAM(List));
      for I := 0 to List.Count - 1 do
      begin
        ThreadId := GetWindowThreadProcessId(HWND(List.Items[I]), ProcessId);
        if ProcessId = AppPID then
        begin
          SendMessageTimeout(HWND(List.Items[I]), WM_SYSCOMMAND, SC_CLOSE, 0, SMTO_ABORTIFHUNG, 500, DWORD(nil^));
          Wait(3000);
          if IsWindow(HWND(List.Items[I])) then
          begin
            PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
            Wait(3000);
            ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
            if ProcessHandle <> 0 then
            begin
              GetExitCodeProcess(ProcessHandle, ExitCode);
              TerminateProcess(ProcessHandle, ExitCode);
              CloseHandle(ProcessHandle);
            end;
          end;
          Break;
        end;
      end;
    finally
      List.Free;
    end;
  end;

end;
Ich musste da mal ein Wait einbauen. Normalerweise würde ich Sleep nehmen. Dann läuft der Code aber auch in einem eigenen Thread. So ähnlich sieht die Funktion in meinem nachprogrammierten Task-Manager aus, um Anwendungen zu schließen.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#8

Re: anderes Programm beenden

  Alt 11. Feb 2005, 20:41
OK, Danke! Dann versuch ichs mal damit...

Gruß

Gambit
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#9

Re: anderes Programm beenden

  Alt 11. Feb 2005, 23:03
Ja, das funzt dann so auch. Einziger Schönheitsfehler - und das war auch bei meiner Haudraufundschluss-Version so - ist, dass das Icon des zu beendenden Programms nicht aus dem Tray verschwindet...erst wenn mann mit der Maus drüber fährt...

Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: anderes Programm beenden

  Alt 11. Feb 2005, 23:17
Das wirst du nicht ändern könne, weil das Fenster kein WM_CLOSE oder WM_DESTROY mehr bekommt, in denen er wohl das Icon aus der TNA entfernt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz