Seite 1 von 1
Explorer-Fenster schließen
Verfasst: 09.02.2010 13:12
von PureBuster
Moin,
ich muss von einer Anzahl .htm-Dateien einen Screenshot anfertigen, stoße aber schon ganz am Anfang auf Schwierigkeiten.
Weil ich vermute, dass die Lösung im API-Bereich liegt, von dem ich wenig Ahnung habe, steht die Frage in dieser Rubrik.
Anbei mein Code der die htm-Dateien nacheinander im Explorer öffnen soll und nach kurzer Zeit wieder schließen und dann die nächste .htm ...genau das mit dem Schließen klappt nicht. KillProgram() hat keine Auswirkungen, WaitProgram() wirkt nicht, obwohl nicht mal ein timeout angegeben ist.
Wo ist mein Denkfehler?
Code: Alles auswählen
ExamineDirectory(1, GetCurrentDirectory(), "*.htm")
While NextDirectoryEntry(1)
explorer.i = RunProgram("explorer" , DirectoryEntryName(1), GetCurrentDirectory(),#PB_Program_Open)
Delay(3000)
KillProgram(explorer)
WaitProgram(explorer)
CloseProgram(explorer)
Wend
FinishDirectory(1)
Parallel dazu gefragt: kann ich ein [STRG] + [W] (Fenster schließen Hotkey beim Explorer) an das mit RunProgramm() gestartete Prog. übergeben?
Danke
__________________________________________________
Code-Tags hinzugefügt
09.02.2010
RSBasic
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 13:24
von NicTheQuick
Sorry, wenn ich jetzt nicht auf deine Fragen eingehe, aber wieso benutzt du nicht einfach das PB-eigene WebGadget und machst davon einen Screenshot? Das stelle ich mir einfacher vor.
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 14:08
von PureBuster
weil die .htm-Dateien so Frame- und Plugin-lastig sind, dass sie im Gadget überhaupt nicht dargestellt werden. Nur mein installierter Explorer mit den dazugehörigen PlugIns stellt die Dinger vernünftig dar. Und von dieser Darstellung brauche ich halt Screenshots und zwar von so vielen, dass Handarbeit nicht akzeptabel ist.
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 14:14
von Kiffi
PureBuster hat geschrieben:[...] dass sie im Gadget überhaupt nicht dargestellt werden. Nur mein installierter Explorer mit den dazugehörigen PlugIns stellt die Dinger vernünftig dar.
seltsam. Das Webgadget ist (unter Windows (und sofern nicht anders angegeben)) lediglich
eine Instanz des IE. Aus diesem Grund müsste es eigentlich alles so darstellen, wie es auch
der IE darstellt.
Grüße ... Kiffi
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 14:37
von PureBuster
zum selbst ausprobieren:
http://www.cgmopen.org/technical/tutorial-2001.zip
...hier liegt ein Tutor über das WebCGM-Vektorgrafikformat inkl. Verlinkungsbeispiele...
(meine htm's sind voll von Frames mit src="....cgm#name(irgenwas)")
zur Darstellung im IE wird ein PlugIn benötigt, z.B.:
http://www.cgmlarson.com/products/VizEx_reader.php
oder
http://www.sdicgm.com/cgm_reader.html
Die Darstellung im IE funktioniert prima, aber schon bei Vorgängen wie "nach PDF drucken" hört alles auf.
Die .cgm-Inhalte werden nicht mitgenommen, selbst ein Acrobat8Pro hat davor kapituliert...daher Screenshots vom "getunten" IE.
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 14:58
von Kiffi
PureBuster hat geschrieben:zum selbst ausprobieren:
ich glaube Dir auch so
Zum Deinem Ursprungsproblem: Ich habe vor einiger Zeit selber die
Erfahrung machen dürfen, dass man das Handle des gestarteten Explorers
nicht so einfach ermitteln kann. Ich bin da ganz pragmatisch gewesen und
bin wie folgt vorgegangen:
* Handles aller geöffneten Fenster ermitteln
* Explorer starten
* Erneut Handles alle Fenster ermitteln
Nun muss es in der Differenz genau 1 Fenster geben (nämlich das des Explorers)
Das ist nicht ganz sauber, aber für Deine Zwecke dürfte es reichen.
Code: Alles auswählen
EnableExplicit
#BufferSize = 2048
Global NewList Windows()
Procedure.s GetClassName(Handle.l)
Protected ClassName.s = Space(#BufferSize)
GetClassName_(Handle, @ClassName, #BufferSize)
ProcedureReturn ClassName
EndProcedure
Procedure EnumProc(Handle.l, lParam.l)
Protected ClassName.s = GetClassName(Handle)
If ClassName = "CabinetWClass" Or ClassName = "ExplorerWClass"
AddElement(Windows())
Windows()=Handle
EndIf
ProcedureReturn #True
EndProcedure
Procedure.l StartExplorer(Path.s)
Protected hwnd
NewList W_Before()
NewList W_After()
; Enumeration der bereits vorhandenen Fenster
; (vor RunProgram())
ClearList(Windows())
EnumWindows_(@EnumProc(), 0)
ForEach Windows()
AddElement(W_Before())
W_Before()=Windows()
Next
RunProgram("explorer.exe", Path, Path)
Delay(1000) ; n bisken warten
; erneute Enumeration aller Fenster
; (nach RunProgram())
ClearList(Windows())
EnumWindows_(@EnumProc(), 0)
ForEach Windows()
AddElement(W_After())
W_After()=Windows()
Next
ForEach W_Before()
ForEach W_After()
If W_Before()=W_After()
DeleteElement(W_After())
EndIf
Next
Next
If ListSize(W_After())=1
FirstElement(W_After())
hwnd = W_After()
EndIf
ProcedureReturn hwnd
EndProcedure
Define hwnd
hwnd = StartExplorer("C:\")
If hwnd
Delay(2000) ; hier kann gescreenshoted werden oder was auch immer
PostMessage_(hwnd, #WM_CLOSE, 0, 0) ; Explorer schliessen
EndIf
Grüße ... Kiffi
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 16:49
von PureBuster
ok, das war schon ein Nahbereichstreffer. Aber noch nicht ganz...
Mit "normalen" Explorer-Fenstern funzt das super; mittels RunProgram("explorer.exe", Path, Path) startest du jedoch nur die File-Browser-Variante des Explorers. Ich benötige aber die Web-Version die mit RunProgram("explorer.exe", File, Path) eine andere Instanz des Explorers startet. Lässt sich auch im Task-Manager erkennen, der eine läuft unter dem Prozess "explorer.exe" der andere unter "IEXPLORE.EXE" und genau den will ich killen.
Stell mal meinen angepassten Code rein:
Code: Alles auswählen
;----------------------------------------------------------------Start dein Code
EnableExplicit
#BufferSize = 2048
Global NewList Windows()
Procedure.s GetClassName(Handle.l)
Protected ClassName.s = Space(#BufferSize)
GetClassName_(Handle, @ClassName, #BufferSize)
ProcedureReturn ClassName
EndProcedure
Procedure EnumProc(Handle.l, lParam.l)
Protected ClassName.s = GetClassName(Handle)
If ClassName = "CabinetWClass" Or ClassName = "ExplorerWClass"
AddElement(Windows())
Windows()=Handle
EndIf
ProcedureReturn #True
EndProcedure
Procedure.l StartExplorer(Path.s,File.s) ;-----------mod Param. Arbeitsverzeichnis/File
Protected hwnd
NewList W_Before()
NewList W_After()
; Enumeration der bereits vorhandenen Fenster
; (vor RunProgram())
ClearList(Windows())
EnumWindows_(@EnumProc(), 0)
ForEach Windows()
AddElement(W_Before())
W_Before()=Windows()
Next
RunProgram("explorer.exe", File, Path) ;-------- mod File
Delay(1000) ; n bisken warten
; erneute Enumeration aller Fenster
; (nach RunProgram())
ClearList(Windows())
EnumWindows_(@EnumProc(), 0)
ForEach Windows()
AddElement(W_After())
W_After()=Windows()
Next
ForEach W_Before()
ForEach W_After()
If W_Before()=W_After()
DeleteElement(W_After())
EndIf
Next
Next
If ListSize(W_After())=1
FirstElement(W_After())
hwnd = W_After()
EndIf
ProcedureReturn hwnd
EndProcedure
;----------------------------------------------------------------start mein Code
ExamineDirectory(1, GetCurrentDirectory(), "*.htm")
While NextDirectoryEntry(1)
;----------------------------------------------------------------start dein Code mod
Define hwnd
hwnd = StartExplorer(GetCurrentDirectory(),DirectoryEntryName(1));-----mod
If hwnd
Delay(4000) ; hier kann gescreenshoted werden oder was auch immer
PostMessage_(hwnd, #WM_CLOSE, 0, 0) ; Explorer schliessen
EndIf
;----------------------------------------------------------------start mein Code
Wend
FinishDirectory(1)
Re: Explorer-Fenster schließen
Verfasst: 09.02.2010 17:14
von PureBuster
OK...ALLES ZURÜCK
Ich hab meinen Denkfehler gefunden...
Code: Alles auswählen
ExamineDirectory(1, GetCurrentDirectory(), "*.htm")
While NextDirectoryEntry(1)
explorer.i = RunProgram("C:\Programme\Internet Explorer\IEXPLORE.EXE" , "file://" + GetCurrentDirectory() + DirectoryEntryName(1), GetCurrentDirectory(),#PB_Program_Open)
Delay(3000)
KillProgram(explorer)
WaitProgram(explorer)
CloseProgram(explorer)
Wend
FinishDirectory(1)
...das war alles. Mit RunProgram("explorer.exe... hatte ich nicht die Instanz gestartet, die nacher auch die .htm darstellt.
Das OS macht sich an der Stelle selbstständig und startet statt dessen von alleine die IEXPLORE.exe. Da konnte KillProgram(explorer) natürlich nicht greifen.
THX für die Hilfe...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden...(;