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