Announcement

Collapse
No announcement yet.

Man braucht dazu das Instanzen-Handle.....???

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

  • Man braucht dazu das Instanzen-Handle.....???

    Hi,ich will eine Fremdanwendung aus meiner heraus schliessen. Dazu habe ich folgendes gefunden: (http://www.delphi-fundgrube.de/)

    Beitext: Man braucht dazu das Instanzen-Handle der zu beendenden Anwendung.
    ---------------------------------------
    unit CloseApp;

    interface

    uses WinTypes;

    procedure CloseAppFromInst(HInst: THandle);

    implementation

    uses WinProcs, Messages;

    { Callback function that has each top-level window passed to it. }<br>
    { Return true to continue enumerating, false to stop. }<br>
    function EnumWindowsProc(Handle: HWND; Info: Pointer): boolean;<br>
    {$IFDEF WIN32} stdcall; {$ELSE} export; {$ENDIF}<br>
    begin<br>
    Result := TRUE; { continue enumeration }<br>
    { Does this app have the same instance as what we are looking for? }<br>
    {$IFDEF WIN32}<br>
    if GetWindowLong(Handle, GWL_HINSTANCE) = LongInt(Info) then begin<br>
    {$ELSE}<br>
    if GetWindowWord(Handle, GWW_HINSTANCE) = LongInt(Info) then begin<br>
    {$ENDIF}<br>
    PostMessage(Handle, WM_CLOSE, 0, 0); { Close the app }<br>
    Result := FALSE; { stop enumerating windows, we are done. }<br>
    end;<br>
    end;<br>

    procedure CloseAppFromInst(HInst: THandle);<br>
    begin<br>
    EnumWindows(@EnumWindowsProc, LongInt(HInst));<br>
    end;<br>

    end.<br>
    ---------------------------------------

    Meine Frage nun, wie kann ich den Instanzen-Handler ermitteln??
    thx!

  • #2
    Hallo,

    der Rückgriff auf die gute alte Windows-Botschaft <b>WM_QUIT</b> führt deutlich schneller zum Ziel, wie die beiden folgenden Beispiele demonstrieren:
    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    // Windows-Taschenrechner beenden (Beschriftung der Fensterzeile)
    PostMessage(FindWindow(nil, 'Rechner'), WM_QUIT, 0, 0);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    // Microsoft Word beenden (Name der Fensterklasse)
    PostMessage(FindWindow('OpusApp', nil), WM_QUIT, 0, 0);
    end;
    </pre>
    Der Name der Fensterklasse des Hauptfensters der zu schließenden Anwendung kann mit dem Delphi-Tool <b>WinSight32</b> ermittelt werden. Die Win32-API-Funktion <b>FindWindow</b> liefert das Handle dieses Fensters zurück, so dass die Botschaft über die Win32-API-Funktion <b>PostMessage</b> in die Botschaftswarteschlange einsortiert wird. Jedes Programm muss seine Botschaftswarteschlange regelmässig auslesen, sobald WM_QUIT vorgefunden wird, beendet sich das Programm selbst.

    P.S: Der Weg über PostMessage + WM_QUIT ist für das eigene Programm "ungefährlicher" als der Weg über SendMessage + WM_CLOSE.
    &#10

    Comment


    • #3
      Vielen Dank für die Hilfe und vor allemauch die Beispiele )
      Werde ich mir sofort mal ansehen!

      thx

      Comment


      • #4
        Super, hat toll funktioniert!!<br>
        <br>
        Hat allerdings ein Weilchen gebraucht bis ich gecheckt hab das ich bei WinSight mit nem Doppelklick zu mehr Infos komm

        BigThx

        Comment


        • #5
          Hallo,

          ich habs noch nicht geckeckt, wie man ein Programm beendet. Kann wer mal einen Beispielcode hier hinterlegen?

          Danke.

          Comment

          Working...
          X