window handle finden

Für allgemeine Fragen zur Programmierung mit PureBasic.
rudolfo
Beiträge: 19
Registriert: 19.10.2008 14:52

window handle finden

Beitrag von rudolfo »

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.
Benutzeravatar
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

Beitrag von ts-soft »

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.
Dafür kannste evtl. auch dies: http://www.purebasic.fr/german/viewtopi ... 24#p267424 nutzen.

//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.
Bild
rudolfo
Beiträge: 19
Registriert: 19.10.2008 14:52

Re: window handle finden

Beitrag von rudolfo »

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

Code: Alles auswählen

· lpStartupInfo
Points to a STARTUPINFO structure that specifies how the main window for the new process should appear.
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*
rudolfo
Beiträge: 19
Registriert: 19.10.2008 14:52

Re: window handle finden

Beitrag von rudolfo »

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
Antworten