Fenster finden mit Wildcards?

Anfängerfragen zum Programmieren mit PureBasic.
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

Fenster finden mit Wildcards?

Beitrag 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
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Da musst du dir wohl alle Titel ausgeben lassen und einzeln überprüfen ob "PureBasic -" vorkommt.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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)
a²+b²=mc²
Christi
Beiträge: 154
Registriert: 31.08.2004 14:17
Kontaktdaten:

Beitrag 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
Dr.Pixel
Beiträge: 90
Registriert: 12.08.2005 12:38

Beitrag 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
Christi
Beiträge: 154
Registriert: 31.08.2004 14:17
Kontaktdaten:

Beitrag 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)
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag 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.
Antworten