Entwickler-Ecke
Windows API - Delphi 2 - Destroywindow funktioniert nicht ?
kobayashi - Mi 09.07.08 14:56
Titel: Delphi 2 - Destroywindow funktioniert nicht ?
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 ?
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;
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);
end; |
Grüße Kobayashi
Moderiert von
Narses: Delphi-Tags hinzugefügt
Delete - Mi 09.07.08 15:08
TerminateProcess(myHandle, 0); Vielleicht so. :wink:
kobayashi - Mi 09.07.08 16:18
j.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 - Mi 09.07.08 19:13
Hi,
Ziemlich ungewöhnliche Formatierung..
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;
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; Flag := DestroyWindow(WND); end; |
mfG,
kobayashi - 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
Delete - Do 10.07.08 15:45
Hast du denn den handle des fensters in meinen vorschlag rein getippt? :wink:
kobayashi - Do 10.07.08 15:55
j.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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!