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



BeitragVerfasst: Mi 09.07.08 14:56 
Hi,

ich habe das Problem, das ich ein Internet-Explorer Fenster was ich durch die WinApi geöffnet habe nicht wieder automatisiert geschlossen bekommen.

Ich habe hier mal einen Teilcode aus dem Projekt gepostet und etwas modifiziert, damit der Rest nicht vom eigentlichen Problem ablenkt. Es geht aber nur um den Befehl das offene Fenster wieder zu schließen.

Der grundsätzliche Ablauf soll sein :

- Die WINApi öffnet ein IExplorer-Fenster einer Website
- Nach 30 Sekunden Wartezeit schließt dieses Fenster
- Die WINAPI öffnet ein neues Fenster
- ... und dies 5x (im realen Projekt mehrere 100 mal)

Klappt alles, außer daß das Fenster nicht zu geht, so dass ich nachher 5 offene Fenster habe. Könnte man natürlich manuell schließen, aber im realen Projekt geht es um mehrere 100 Fenster die nacheinander nach einer gewissen Verzögerung abgearbeitet werden müssen.

Schließen die Fenster aber nicht und bleiben offen, ist Chaos vorprogrammiert. Weiss nicht was passiert wenn Windows 500 Inztanzen des IE-Explorer verwalten soll.

Destroywindow und das testweise verwendete Closewindow zeigen also keine Wirkung.
Wie bekomme ich also das per API geöffnete Fenster wieder zu ?
ausblenden 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:
For i:= 1 to 5  

   Do begin
        
        Wnd        := HWND_TOP;
        Operation  := 'open'+#0;
        Filename   := 'iexplore.EXE'+#0;
        Parameters := 'www.demowebsite.de';                             
        Directory  := 'C:\Programme\Internet Explorer'+#0;
        ShowCmd    := SW_ShowNormal;  {Maximized; }

        APIResponse :=  ShellExecute(Wnd,Operation,Filename,Parameters,Directory,ShowCmd);

        

        timestamp := now;
        DecodeTime(timestamp,vh,vmin,vsec,vmsec);
        Datasec := (vh*360)+(vmin*60)+(vsec);

        repeat
          timestamp := now;
          DecodeTime(timestamp,vh,vmin,vsec,vmsec);
          immosec := (vh*360)+(vmin*60)+(vsec)
        until immosec-datasec > 30 ;

        wnd  := HWND_TOP;
        Flag := destroywindow(WND);   (* Hier sollte das Window schließen - tut es aber nicht *)

     end;

Grüße Kobayashi

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.07.08 15:08 
TerminateProcess(myHandle, 0); Vielleicht so. :wink:
kobayashi Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 09.07.08 16:18 
user profile iconj.klugmann hat folgendes geschrieben:
TerminateProcess(myHandle, 0); Vielleicht so. :wink:


Danke für den Versuch .....

nur leider gehts auch nicht, wie bei meiner Variante bleiben alle Fenster offen.

Trotzdem Danke.

Vielleicht hat noch jemand eine Idee.

Grüße Kobayashi
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mi 09.07.08 19:13 
Hi,

Ziemlich ungewöhnliche Formatierung..
ausblenden Ich würde das so machen:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
  for i:= 1 to 5 do begin
    Wnd := HWND_TOP;
    Operation := 'open' + #0;
    Filename := 'iexplore.EXE' + #0;
    Parameters := 'www.demowebsite.de';                             
    Directory := 'C:\Programme\Internet Explorer' + #0;
    ShowCmd := SW_ShowNormal;  {Maximized; }

    APIResponse := ShellExecute(Wnd, Operation, Filename, 
                             Parameters, Directory, ShowCmd);

    DecodeTime(now, vh, vmin, vsec, vmsec);
    Datasec := vh * 360 + vmin * 60 + vsec;
    repeat
      DecodeTime(now, vh, vmin, vsec, vmsec);
      immosec := vh * 360 + vmin * 60 + vsec;
    until immosec - datasec > 30 ;
    Wnd := HWND_TOP;  //hast du das nicht schon oben gemacht?
    Flag := DestroyWindow(WND);   (* Hier sollte das Window schließen - tut es aber nicht *)
  end;


mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
kobayashi Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 10.07.08 15:43 
Hi Daniel,

klar Deine Lösung ist etwas eleganter :-)

Die zweite Zuweisung des Handles ist ein Überbleibsel meiner zahlreichen Try and Error-Versuche, den Fehler rauszufinden. Ist eigentlich unötig, da oben schon zugewiesen.

Hast du eventuell auch ein Vorschlag für das eigentliche Problem ?

Wenn ich nur wüste warum die dämlichen Fenster nicht zugehen.

Grüße Kobayashi


Zuletzt bearbeitet von kobayashi am Do 10.07.08 15:46, insgesamt 1-mal bearbeitet
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.07.08 15:45 
Hast du denn den handle des fensters in meinen vorschlag rein getippt? :wink:
kobayashi Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 10.07.08 15:55 
user profile iconj.klugmann hat folgendes geschrieben:
Hast du denn den handle des fensters in meinen vorschlag rein getippt? :wink:


Ja natürlich, aber nix, alles bleibt offen.

Auch alternativ mit festen Handle Nummern wie z.B. 3333 und so probiert. Nix, die Fenster bleiben offen. Dürfte von der Theorie nicht so sein, ist aber so. :-(

Hab auch testweise TerminateProcess(GetTopWindow, 0) und TerminateProcess(GetActiveWindow,0) probiert, was ja von der Theorie her das oberste bzw. das aktive Window schließen müsste. Aber auch hier nix. Merkwürdig ......

Bin wohl zu blöd oder die Win-Api funktioniert bei mir nicht. Das Öffnen mit shellexecute dagegen läuft ja problemlos.

Also wie die "Büchse der Pandora" - geht auf, aber wieder zumachen .....



Grüße Kobayashi
kobayashi Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 10.07.08 16:36 
Was mir noch ergänzend auffällt, wenn ich testweise mit

APIResponse := ShellExecute(3333,Operation,Filename,Parameters,Directory,ShowCmd)

5x öffne gehen trotzdem 5 einzelne Fenster auf obwohl ja alle die selbe Handle-Nummer haben. Müsste sich nicht das ganze 5x in ein und demselben Fenster öffnen, das der Handle ja kostant bleibt ?

Ich habe das Gefühl, da mir irgendwie die Handle der geöffneten Fenster verloren gehen, so dass die Handle bezogenen Schließbefehle nicht mehr greifen.

Aber mit GetTopWindow geht ja auch nichts zu.


Da scheint irgendwo ein prinzipieller Denkfehler zu sein, nur wo ?

Grüße Kobayashi