Ich komme bei folgender Aufgabe nicht weiter:
Ich öffne mit RunProgramm eine url in firefox. firefox erzeugt ein window. Nun brauche ich das handle des windows. Bisher konnte ich über den window title ganz gut an das handle kommen, habe aber jetzt windows mit unterschiedlichem Inhalt aber gleichem title und komme nicht mehr an das richtige handle ran. Kann das gestartete Programm nicht das window handle ausgeben? Die API createprocess() hat soviele undurchsichtige Parameter, dass ich erst mal kapituliert habe. Geht das einfacher?
Um Windows zu bearbeiten, die nicht von meinen threads erstellt wurden benutze ich APIs aus dem API-guide.exe, die aber leider nicht mehr updated werden.
window handle finden
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: window handle finden
Dafür kannste evtl. auch dies: http://www.purebasic.fr/german/viewtopi ... 24#p267424 nutzen.rudolfo hat geschrieben:Um Windows zu bearbeiten, die nicht von meinen threads erstellt wurden benutze ich APIs aus dem API-guide.exe, die aber leider nicht mehr updated werden.
//edit
vielleicht so:
Code: Alles auswählen
Define hWnd.i, Title.s{255}
RunProgram("http://realsource.de")
Repeat
hWnd = GetForegroundWindow_()
GetWindowText_(hWnd, @Title, 255)
Delay(20)
Until FindString(Title, " Mozilla Firefox")
Debug Title
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: window handle finden
GetForegroundWindow_() hab ich schon probiert. Man kommt tatsächlich auch damit hin, hängt aber davon ab, wie die Position der anderen windows in der Hirarchie ist. Hier isses so, dass der Debugger sich vorne hin setzt und ich kann nix machen. Könnte ohne debugger funktionieren, bin aber noch beim entwickeln.
OK, den link muss ich mal studieren.
Wenn ich nicht ganz verblödet bin, dann hab ich bin in der Autowin lib nix wirklich zutreffendes gefunden. Mit dem createprocess_() kann man mit einem param glaub ich was machen
da werd ich mal tiefer eintauchen. Aber dass Windows das so schwer macht versteh ich nit. Als minimum könnte man doch den title eindeutig machen, in dem das handle dort im klartext erscheint oder so ähnlich *kopfschüttel*
OK, den link muss ich mal studieren.
Wenn ich nicht ganz verblödet bin, dann hab ich bin in der Autowin lib nix wirklich zutreffendes gefunden. Mit dem createprocess_() kann man mit einem param glaub ich was machen
Code: Alles auswählen
· lpStartupInfo
Points to a STARTUPINFO structure that specifies how the main window for the new process should appear.
Re: window handle finden
Wem es was nützt, der kann folgende Möglichkeit probieren. Das gesuchte Window ist damit zuverlässig das foreground-window, aber ein Problem ist nach wie vor zu wissen, wann das handle verfügbar ist. Ich komme jetzt damit hin. Das Minimieren der windows sieht spektakulär aus und hat auch gelegentlich "Seitffekte". Also nicht wundern!
Code: Alles auswählen
Procedure minimizewindow(winhndl.l)
If IsWindowVisible_(winhndl) And Not IsIconic_(winhndl)
CloseWindow_(winhndl) ; alle störenden windows minimieren
EndIf
ProcedureReturn #True
EndProcedure
Procedure.l LoadHomePage(url.s)
EnumWindows_(@minimizewindow(), 0)
SetCursorPos_(500,500) ; irgendwo in die Mitte wo das neue window erscheinen wird
R = RunProgram(firefoxhome+"firefox.exe", url, firefoxhome)
Delay(1000) ; leider notwendig, ohne Wartezeit kriegt man nicht das korrekte handle
winhndl.l = GetForegroundWindow_()
ProcedureReturn winhndl
EndProcedure