Announcement

Collapse
No announcement yet.

Wie bekomme ich eine mit ShellExecute gestartete Anwendung wieder geschlossen.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie bekomme ich eine mit ShellExecute gestartete Anwendung wieder geschlossen.

    Ich starte mit ShellExecute in einem Programm ein weiteres Programm. Hier bekomme ich dann auch eine HInstance Variable zurück.
    Wie kann ich nun das gerufene Programm wieder schließen.

    Der Aufruf muß nicht unbedingt mit ShellExecute erfolgen. Mir fällt nur selber kein anderer Aufruf außer ShellExecuteEx ein.

    Peter Schmitz

  • #2
    Hallo Peter,<br>Ich weiss nicht ob es einen eleganteren Weg gibt, aber bislang hat es immer funktioniert.<br>

    <pre>

    procedure TForm1.Button2Click(Sender: TObject);
    var
    sParams : String;
    sAppName : String;
    begin
    sParams:=' ';
    sAppname:='c:\win\notepad.exe';
    AppHandle:=ShellExecute(Handle,'open',PChar(sAppna me),PChar(sParams),Nil,SW_SHOW);
    Sleep(1000); // Warten bis Notepad gestartet ist
    AppHandle:=FindWindow('Notepad',Nil);
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin
    SendMessage(AppHandle,WM_SYSCOMMAND,SC_CLOSE,0); // Schließen
    end;

    </pre>

    <br>
    Den notepad Classname habe ich mit WinSight herausbekommen.<br>
    Was man machen muß, wenn man beliebige Anwendungen Starten und Beenden möchte (auch ohne WinSight) würde ich auch gerne wissen.<br>
    :-) Jens Schuman

    Comment


    • #3
      Hallo,

      das gleich Problem habe ich auch, nur dass ich weder den Klassenname noch den Fenstertitel zur Laufzeit kenne. Gibt es keine möglichkeit aus der HINSTANCE irgendwie das Fensterhandle zu ermitteln?

      Ich habe auch gelesen, es soll gehen indem man alle Fenster aufzählt, dann das richtige über den EXE-Pfad ermittelt und dann das Handle bekommen kann. Nur weiss ich nicht wie das geht.

      Kann mir jemand weiterhelfen?

      Danke im Voraus,
      Patric

      Comment


      • #4
        Hallo,

        mit der Win32-API-Funktion <b>EnumWindows</b> kann man sich von Windows alle Fenster auflisten lassen. Ein Beispiel für die Suche nach dem Text in der Fenstertitelzeile ist unter dem Thema <i>Prozesse (Win95/NT) erkennen, welche laufen</i> im Ordner <i>Delphi - Diverses</i> zu finden

        Comment


        • #5
          Das müsste gehen, allerdings krieg ich das irgendwie nicht hin - für ein Code-Bespiel wär ich sehr dankbar.

          Patric

          Comment


          • #6
            Hallo,

            wenn man im FORUM nach der Zeichenkette "EnumWindows" sucht, findet man das folgende Beispiel, das ich am 11.05. bereits als Antwort auf eine andere Frage verwendet habe:

            Das folgende Beispiel demonstriert die Suche einer NOTEPDAD.EXE-Instanz. Da dort im Titel auch der Dateiname angezeigt wird, sucht das Programm nur nach der Zeichenkette "Editor":
            <pre>
            function EnumWindProc(Wnd: HWND; i: Integer): Boolean; stdcall;
            const
            cLENGTH = 199;
            var
            szTitel : array[0..cLENGTH] of Char;
            pFound : PChar;
            begin
            GetWindowText(wnd, szTitel, cLENGTH);
            pFound := AnsiStrPos(szTitel, 'Editor');
            if Assigned(pFound) then
            Form1.ListBox1.Items.Add(szTitel);
            Result := True;
            end;

            procedure TForm1.Button1Click(Sender: TObject);
            begin
            ListBox1.Clear;
            EnumWindows(@EnumWindProc,0);
            end;
            </pre>
            Über die Win32-API-Funktion <b>EnumWindows</b> wird dafür gesorgt, das Windows für jedes Fenster die eigene Callback-Funktion aufruft. Wird das gesuchte Fenster erkannt, kann man das Fenster-Handle sichern und das Programm über die Windows-Botschaft <b>WM_CLOSE</b> beenden

            Comment

            Working...
            X