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
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
wenn Du den Inhalt von Class mit LCase in Kleinbuchstaben wandelst, dann
sollte Dein Suchstring ebenfalls nur Kleinbuchstaben enthalten.
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
Wenn ich dann noch die handles von der Textfeldern herausbekomme bin ich GLÜCKLICH
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.