Autor Beitrag
TryAndError
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 03.11.07 18:28 
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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 04.11.07 02:51 
Hier kommt der Code, der das ferngesteuerte Programm beenden soll:

ausblenden volle Höhe 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);                            // hier wird das Handle vom Hauptfenster ermittelt
      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);                                                   // hier wird der Exit Button gegrückt
                                                                           // und das Programm bleibt hängen!!!

      wnd6 := FindWindow('#32770', Anwendung);                             // hier sollte das Handle des Dialogfenstern ermittelt werden
                                                                           // es besitzt die gleiche Klasse und Bezeichnung, wie das
                                                                           // Hauptfenster
      wnd7 := FindWindowEx2(wnd6, 'Button'1);                            // hier soll das Handle des OK Button ermittelt werden
      ClickButton(wnd7);                                                   // hier soll das Dialogfenster geschlossen werden
      //KillTask(Anwendung1);                                              // bisheriges beenden mit KillTask
    end;
  if IsExeRunning(Anwendung2) then
    begin
      KillTask(Anwendung2);
    end;
  JvLabel2.Caption := Status4;
  JvLabel2.Refresh;
end;
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.