Seite 1 von 2

Fenster finden mit Wildcards?

Verfasst: 24.08.2005 15:16
von Dr.Pixel
Hallo.
Wie finde ich ein Fenster dass z.B. immer mit "Purebasic - " anfängt?
Mal heisst es "Purebasic - test.pb" !
Mal heisst es "Purebasic - Windowschild.pb"
...je nachdem welchen Sourcecode man gerade bearbeitet.

mit

Code: Alles auswählen

FindWindow_(0, "Purebasic - ") 
finde ich das Fenster (z.B. "Purebasic - test.pb") nicht!
Gibt es hierfür Wildcards etc. ?

Gruss Dr. Pixel

Verfasst: 24.08.2005 15:18
von Batze
Da musst du dir wohl alle Titel ausgeben lassen und einzeln überprüfen ob "PureBasic -" vorkommt.

Verfasst: 26.08.2005 07:42
von Dr.Pixel
Batze hat geschrieben:Da musst du dir wohl alle Titel ausgeben lassen und einzeln überprüfen ob "PureBasic -" vorkommt.
Dass kann ja so keine Lösung sein.
Das Programm kann ja nicht alle 30000 (Parent+Child)-Fenster einlesen und mit einem String vergleichen!
Das würde ja zu lange dauern.
Gibts da keine andere Lösung?
In dem Codearchiv habe ich leider nichts gefunden.

Gruss Dr. Pixel

Verfasst: 26.08.2005 08:05
von Kiffi
> Das Programm kann ja nicht alle 30000 (Parent+Child)-Fenster einlesen
> und mit einem String vergleichen!

ich würde sagen, dass das trotzdem relativ flott geht.

Andererseits glaube ich kaum, dass Du zum lösen Deiner Aufgabe (wie
immer sie auch lauten mag) alle gefundenen Fenster wirklich benötigst.

> Gibts da keine andere Lösung?

nein, die gibt' nicht.

[Edit]

Damit möchte ich sagen, dass es keine Möglichkeit gibt, [c]FindWindow[/c] mit
Wildcards zu verwenden. Es gibt sicherlich andere Wege, wie Du schneller
an das von Dir gesuchte Fenster kommst. Da Du jedoch noch nicht beschrieben
hast, was Dein Programm machen soll, kann ich Dir keine konkreten Tipps
geben.

[/Edit]


Grüße ... Kiffi

Verfasst: 26.08.2005 10:51
von Dr.Pixel
Also:
Ich suche ein Fenster dass immer mit dem Namen "PureBasic" anfängt.

Leider geht es mit diesem Code nicht:

Code: Alles auswählen

Global hPB.l
 
Procedure.s GetWindowClass(hwnd) 
    Buffer.s = Space(1000) 
    GetClassName_(hwnd,@Buffer,1000) 
    ProcedureReturn Buffer 
EndProcedure

Procedure.s GetWindowName(hwnd) 
    Buffer.s = Space(1000) 
    GetWindowText_(hwnd,@Buffer,1000) 
    ProcedureReturn Buffer 
EndProcedure

Procedure EnumWindowsProc(hwnd.l,lParam.l) 
    Class.s = GetWindowClass(hwnd) 
    Name.s  = GetWindowName(hwnd) 
    If FindString(LCase(Class),"PureBasic",0)
       Debug "---------------"     
       Debug hwnd
       Debug "---------------"
       ProcedureReturn 1 
      Else 
       Debug Name 
       Debug Class 
       Debug hwnd 
       hPB = hwnd 
       ProcedureReturn 0 
     EndIf 
ProcedureReturn 1 
EndProcedure 



EnumWindows_(@EnumWindowsProc(),0) 
;hPB sollte jetz das Handle vom gefundenen Fenster haben!!!
Was mache ich falsch?

Danke, Dr. Pixel

Verfasst: 26.08.2005 10:54
von Kiffi

Code: Alles auswählen

If FindString(LCase(Class),"PureBasic",0)
wenn Du den Inhalt von Class mit LCase in Kleinbuchstaben wandelst, dann
sollte Dein Suchstring ebenfalls nur Kleinbuchstaben enthalten.

Code: Alles auswählen

If FindString(LCase(Class),"purebasic",0)

Verfasst: 26.08.2005 11:10
von Christi

Code: Alles auswählen

desktopid.l = GetDesktopWindow_()
fensterid.l = FindWindowEx_(desktopid.l, 0, 0, 0)
While fensterid.l
  
  laenge = GetWindowTextLength_(fensterid.l)
  text.s = Space(laenge + 1)
  GetWindowText_(fensterid.l, @text, laenge + 1)
  
  If Left(text.s, 12) = "PureBasic - "
    Debug text
  EndIf
  
  fensterid.l = FindWindowEx_(desktopid.l, fensterid.l, 0, 0)
Wend

Verfasst: 26.08.2005 14:15
von Dr.Pixel
@ Kiffi: Oops, klar muss alles kleingeschrieben werden!
Trotzdem findet das Programm Purebasic nicht !?


@ Christi: Oh, danke. So hatte ich mir es vorgestellt !!!
Klappt wunderbar!
Aber warum werden NUR Parent-Fenster gefunden und KEINE Child-Fenster?
Oder muss ich vom gefundenen handle des Parent-Fensters aus das Child-Fenster finden?
Nur die Frage ist wie?

Hier ein Beispiel:
Parent-Fenster heisst: "AR System User - Incident-Management (Neu)"
Das dazugehörige Parent-Fenster lautet: "Incident-Management (Neu)"
Siehe Screenshot: http://mitglied.lycos.de/christian1973/ars.jpg
Wie finde ich jetzt das Child-Fenster "Incident-Management (Neu)" ???

Man, ich bin so kurz vorm Ziel :o
Wenn ich dann noch die handles von der Textfeldern herausbekomme bin ich GLÜCKLICH :mrgreen:

Fast glücklicher Dr. Pixel

Verfasst: 26.08.2005 14:21
von Christi
vieleicht hilft dir das weiter:
(erstellt eine datei "c:\alle_fenster.txt")

Code: Alles auswählen

Global drann.s

Procedure zeilenumbruch_weck(zeiger)
  byte = PeekB(zeiger)
  While byte
    If byte = 13 Or byte = 10
      PokeB(zeiger + z, ' ')
    EndIf
    z + 1
    byte = PeekB(zeiger + z)
  Wend

EndProcedure


Procedure fenster(fenster)
  gadget = FindWindowEx_(fenster, 0, 0, 0)
  While gadget
    laenge = SendMessage_(gadget, #wm_gettextlength, 0, 0)
    text.s = Space(laenge + 1)
    SendMessage_(gadget, #wm_gettext, laenge + 1, @text)
    typ.s = Space(1000)
    GetClassName_(gadget, @typ, 1000)
    aussehen = GetWindowLong_(gadget, #GWL_STYLE)
    ;WriteStringN(drann + Str(gadget) + " / " + text.s + " / " + typ + " / " + Str(aussehen))
    zeilenumbruch_weck(@text)
    ;Debug text
    WriteStringN(drann + typ + " / " + text)
    drann + Chr(9)
    fenster(gadget)
    drann = Left(drann, Len(drann) - 1)
    gadget = FindWindowEx_(fenster, gadget, 0, 0)
  Wend
EndProcedure

CreateFile(0, "c:\alle_fenster.txt")
fenster(GetDesktopWindow_())
CloseFile(0)

Verfasst: 27.08.2005 11:14
von Icke
Der letzte Codeschnipsel sieht ja schon interessant aus, auch wenn ich nicht alles daraus begreife. Ich frage mich ob es möglich ist damit z.B. Buttons fremder Programme zu drücken, oder inhalte von Feldern zu ändern.