Entwickler-Ecke
Windows API - Problem ein gesteuertes Programm zu beenden
TryAndError - Sa 03.11.07 18:28
Titel: Problem ein gesteuertes Programm zu beenden
Hallo Delphi Freunde,
es ist mal wieder so weit, ich brauche Eure Hilfe.
Zu meinem Problem. Ich habe ein Programm geschrieben, mit dem ich eine andere Anwendung starte und in einem gewissen Rahmen "steuere".
Wenn ich diese Anwendung über mein Programm wieder beenden möchte, erscheint ein Dialog, ausgelöst von der zu schließenden Anwendung, mit der Frage, ob ich wirklich beenden möchte. So weit klappt alles prima.
Nun wollte ich mit meinem Programm das Handle des Dialogs und des OK Button ermitteln, um den Dialog zu schließen.
Das Problem besteht nun darin, dass direkt nach dem Befehl "ClickButton(handle)" um die Anwendung zu schließen, das Dialogfensters erscheint und mein Programm nicht weiter läuft.
Erst wenn ich mit der Maus den Dialog beende, läuft mein Programm wieder.
Weiß jemand woran das liegt?
Um dieses Problem zu umgehen "schieße" ich die Anwendung mit "KillTask(Anwendung)" einfach ab.
Nicht die eleganteste Lösung, aber anders habe ich es halt noch nicht hinbekommen.
Dies hat nun leider den Schönheitsfehler, dass das Icon der Anwendung nicht aus der TNA entfernt wird.
Erst wenn ich mit der Maus darüber gehe, wird das Icon gelöscht.
Gibt es vielleicht eine Möglichkeit, die TNA über das Programm zu aktuallisieren?
Ich hoffe, es ist einergermaßen verständlich ausgedrückt.
Es grüßt TryandError
Tilo - Sa 03.11.07 19:11
Zeigt mal etwas Code. Am besten von der Stelle an der Du dein "ferngestuertes" Programm beenden möchtest.
Sonst kann hier nur geraten werden.
Mein Hinweis: Versuch per Sendmessage/Postmessage/... die Tastenkombination Alt+"o" an das Programm zu senden.
TryAndError - So 04.11.07 02:51
Hier kommt der Code, der das ferngesteuerte Programm beenden soll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TForm1.Button2Click(Sender: TObject);
begin JvLabel2.Caption := Status3; JvLabel2.Refresh; if IsExeRunning(Anwendung1) then begin wnd1 := FindWindow('#32770', Anwendung1); wnd3 := FindWindowEx2(wnd1, 'Static', 3); sendmessage(wnd3, WM_GETTEXT, 1024, Integer(@buffer)); if buffer <> 'Getrennt' then begin ClickButton(wnd2); Sleep(1000); end; wnd4 := FindWindowEx2(wnd1, 'Button', 6); ClickButton(wnd4); wnd6 := FindWindow('#32770', Anwendung); wnd7 := FindWindowEx2(wnd6, 'Button', 1); ClickButton(wnd7); end; if IsExeRunning(Anwendung2) then begin KillTask(Anwendung2); end; JvLabel2.Caption := Status4; JvLabel2.Refresh; end; |
Tilo - So 04.11.07 10:38
schreib mal in Zeile 18 ein application.ProzessMessage oder ein Slepp(100) rein.
Ich habe auch mal versucht ein Programm fernzusteuern. Meine Erfahrung war das das ferngesteuerte Programm Zeit benötigt um Eingaben zu verarbeiten.
TryAndError - So 04.11.07 14:27
Hallo Tilo,
ich habe es ausprobiert. Leider funktionieren die beiden Varianten nicht.
Habe auch schon einmal ClickButton durch SendMessage ... WM_LBUTTONDOWN / WM_LBUTTONUP ersetzt.
Hat alles nichts geholfen. In dem Moment, wo das Dialogfenster erscheint, führt Delphi keine Befehle mehr aus.
Dabei ist es egel, ob ich in der Entwicklungsumgebung arbeite, oder das compilierte Programm benutze.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!