PID ... mir schwirrt der Kopf!
Vorgeschichte
Ich brauchte das HWND zu einem bestimmten Fenster, hatte aber nur eine PID. Im Netz gibt es viele (kontroverse) Code-Snippets á la "HwndFromPid". Nun ja, eine PID hatte ich ja (scheinbar!), denn
"Run" gibt die PID des Prozesses zurück, der gestartet wurde.
Hat aber nicht funktioniert, bis ich herausgefunden habe, dass es mehrere PIDs gibt, wenn beim Aufrufen per "Run" das zu startende Programm schon läuft. (Korrigiert mich, wenn das nicht stimmt!) In meinem Fall war das Prog schon gestartet (Anzeigen der Hilfe-Datei). Es sollte mit jedem weiteren Aufruf weitere Suchbegriffe geöffnet werden. Die von "Run" zurückgegebene PID war dann nutzlos.
Ich habe das Probelm gelöst, indem ich mithilfe von WinList() das entsprechende PID gesucht habe. Mit dem richtigen PID konnte ich auch das entsprechende HWND ermitteln.
Thema
Bei meinen Recherchen habe ich im einen Code in den FAQ des EN Forums gefunden: "How can I get a window handle when all I have is a PID?" Dort gibt es am Ende des Abschnitts folgenden Code:
;Function for getting HWND from PID
Func _GetHwndFromPID($PID)
$hWnd = 0
$winlist = WinList()
Do
For $i = 1 To $winlist[0][0]
If $winlist[$i][0] <> "" Then
$iPID2 = WinGetProcess($winlist[$i][1])
If $iPID2 = $PID Then
$hWnd = $winlist[$i][1]
ExitLoop
EndIf
EndIf
Next
Until $hWnd <> 0
Return $hWnd
EndFunc;==>_GetHwndFromPID
Alles anzeigen
Meine Frage ist, wozu ist die Do-Until Schleife da? Wahrscheinlich stehe ich auf dem Schlauch, aber wird da nicht der immergleiche Code ausgeführt, der zu immergleichen Ergebnis führt?
Am Anfang wird das Array $winlist erstellt, es folgt die äußere Do-Until Schleife. Darin läuft die innere For-Next Schleife, die das Array durchläuft von 1 bis "gefunden" oder UBound. Die Do-Until Schleife wird mit Until $hWnd <> 0 abgebrochen, wenn das HWND gefunden wurde. Daraus ergeben sich zwei Möglichkeiten.
1. Das HWND wird gefunden => alle Schleifen werden abgebrochen, Ergebnis returniert.
2. Das HWND wird NICHT gefunden => die Do-Unti Schleife läuft bis zum jüngsten Tag.
Wenn das HWND gefunden werden kann, würde das doch beim ersten Durchlauf der For-Next Schleife passieren, oder nicht? Und wenn das HWND beim ersten Durchlauf NICHT gefunden wird, wieso sollte es dann beim zweiten oder 1.001-ten Durchlauf gefunden werden?
Hab ich da einen Denkfehler?