Explorer-Fenster schließen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Explorer-Fenster schließen

Beitrag 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
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Explorer-Fenster schließen

Beitrag 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.
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Re: Explorer-Fenster schließen

Beitrag 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.
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Explorer-Fenster schließen

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Re: Explorer-Fenster schließen

Beitrag 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.
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Explorer-Fenster schließen

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Re: Explorer-Fenster schließen

Beitrag 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)
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Re: Explorer-Fenster schließen

Beitrag 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...(;
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Antworten