Seite 1 von 1

Statusbar vorhanden ?

Verfasst: 21.08.2014 17:57
von hjbremer
Guten Tag,

Kann man herausfinden ob ein Fenster eine Statusbar hat und welche Id ?

Re: Statusbar vorhanden ?

Verfasst: 21.08.2014 18:28
von ts-soft
Ich nehme an, Fremdfenster und Windows:

Code: Alles auswählen

Procedure EnumChildProc(hWnd, lParam)
  Protected CName.s{128}

  GetClassName_(hWnd, @CName, 128)
  If CName = "msctls_statusbar32"
    PokeI(@lParam, hWnd)
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

Define hStatusbar.i

EnumChildWindows_(hWnd, @EnumChildProc(), @hStatusbar)
Habs jetzt nicht getested, aber so in etwa sollte es gehen.

Gruß
Thomas

Re: Statusbar vorhanden ?

Verfasst: 21.08.2014 18:57
von RSBasic
http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
Wenn -1, dannn gibt es keine StatusBar.

Re: Statusbar vorhanden ?

Verfasst: 21.08.2014 19:02
von NeoChris
Statusbar vorhanden ?
Warum schreibst du vor dem Fragezeichen ein Leerzeichen? Ich schreib doch auch nicht vor einem Punkt ein Leerzeichen . << Dat is Kacka. :D

Re: Statusbar vorhanden ?

Verfasst: 21.08.2014 19:54
von ts-soft
Hatte nen kleinen Fehler drinn.

Hier der korrigierte Beispiel:

Code: Alles auswählen

Procedure EnumChildProc(hWnd, *lParam.Integer)
  Protected CName.s{128}

  GetClassName_(hWnd, @CName, 128)
  If CName = "msctls_statusbar32"
    *lParam\i = hWnd
    ProcedureReturn #False
  EndIf
 
  ProcedureReturn #True
EndProcedure

Define hStatusbar.i, hWnd.i

hWnd = FindWindow_(0, "PureBasic 5.30 (x64)")
If hWnd
  EnumChildWindows_(hWnd, @EnumChildProc(), @hStatusbar)
  Debug hStatusbar
EndIf

Verfasst: 21.08.2014 20:21
von CodeCommander
Tut mir leid dass ich wieder "meckern" muss aber ich versuche nur gute Tipps zu geben. :)
ts-soft hat geschrieben:

Code: Alles auswählen

Procedure EnumChildProc(hWnd, *lParam.Integer)
  Protected CName.s{128}

  GetClassName_(hWnd, @CName, 128)
  If CName = "msctls_statusbar32"
    *lParam\i = hWnd
    ProcedureReturn #False
  EndIf
 
  ProcedureReturn #True
EndProcedure

Define hStatusbar.i, hWnd.i

hWnd = FindWindow_(0, "PureBasic 5.30 (x64)")
If hWnd
  EnumChildWindows_(hWnd, @EnumChildProc(), @hStatusbar)
  Debug hStatusbar
EndIf
Das Sieht langsam aus weil das eine Enumeration-Schleife ist. Gibt es damit keinen Performance Verlust bei über 10000 Gadgets die einzeln abgefragt wird ob deren Klasse gleich StatusBar ist?
ts-soft hat geschrieben:

Code: Alles auswählen

hWnd = FindWindow_(0, "PureBasic 5.30 (x64)")
Toller lauffähiger Beispielcode. Man sollte nicht via Fenstertitel das Handle lesen wenn der Titel variable ist zb. wenn dieser eine Versionsnummer enthält..
ts-soft hat geschrieben:

Code: Alles auswählen

Protected CName.s{128}
GetClassName_(hWnd, @CName, 128)
Woher nimmst du die Information dass der Class Name maximal 128 Zeichen lang ist? Laut WNDCLASS beträgt die maximale Länge von Class Name 256 Zeichen und nicht 128! Du must schon sauber WindowsAPI umsetzen und nicht willkürliche Zahlen verwenden!

Re: Statusbar vorhanden ?

Verfasst: 21.08.2014 20:26
von hjbremer
RSBasic hat geschrieben:http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
Wenn -1, dannn gibt es keine StatusBar.
Vielen Dank, genau das habe ich gebraucht !!! :praise:

Code: Alles auswählen

   Macro GetStatusbar(window)
      
      GetProp_(WindowID(window), "PB_StatusBar_ID") -1
           
   EndMacro 

Re: Statusbar vorhanden ?

Verfasst: 21.08.2014 20:48
von Kiffi
CodeCommander hat geschrieben:Das Sieht langsam aus weil das eine Enumeration-Schleife ist. Gibt es damit keinen Performance Verlust bei über 10000 Gadgets die einzeln abgefragt wird ob deren Klasse gleich StatusBar ist?
das ist der übliche Weg, um Handles in einer unbekannten und beliebig tiefen Struktur zu ermitteln. Wie wäre Dein Lösungsvorschlag?
CodeCommander hat geschrieben:Toller lauffähiger Beispielcode. Man sollte nicht via Fenstertitel das Handle lesen wenn der Titel variable ist zb. wenn dieser eine Versionsnummer enthält..
richtig erkannt: das ist ein Beispielcode. Den kann man sich an seine Bedürfnisse anpassen. Die IDE hat jeder installiert, der diesen Code ausführen kann und die Titelanpassung von x64 auf x86 sollten wohl jeder hinbekommen.