Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0215: Child-Windows enummerieren

 von 

Beschreibung 

Controls sind Childs/KinderFenster eines Parents/ElternFensters. Welche auf letzterem so rumsitzen läßt sich mit diesem Tip herausfinden

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

EnumChildWindows, GetClassNameA (GetClassName), GetFocus, GetWindowTextA (GetWindowText), GetWindowTextLengthA (GetWindowTextLength)

Download:

Download des Beispielprojektes [3,15 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Modul "Module1" alias MODULE1.BAS ---------

Option Explicit

Private Declare Function GetWindowTextLength Lib _
        "user32" Alias "GetWindowTextLengthA" (ByVal _
        hwnd As Long) As Long
        
Declare Function GetWindowText Lib "user32" Alias _
        "GetWindowTextA" (ByVal hwnd As Long, ByVal _
        lpString As String, ByVal cch As Long) As Long

Private Declare Function EnumChildWindows Lib "user32" _
        (ByVal hWndParent As Long, ByVal lpEnumFunc _
        As Long, ByVal lParam As Long) As Long
        
Private Declare Function GetClassName Lib "user32" Alias _
        "GetClassNameA" (ByVal hwnd As Long, ByVal _
        lpClassName As String, ByVal nMaxCount As Long) _
        As Long

Public Declare Function GetFocus Lib "user32" () As Long

Public Child() As Long

Public Function Init(hwnd&, LB As ListBox)
  Dim x&, Class$, Result&, l&, Cpt$
  ReDim Child(0 To 0)
  
  LB.Clear
  Call EnumChildWindows(hwnd, AddressOf EnumChilds, 0)
  If UBound(Child) > 0 Then
    For x = 0 To UBound(Child) - 1
      Class = Space$(128)
      Result = GetClassName(Child(x), Class, 128)
      Class = LCase(Left$(Class, Result))
      l = GetWindowTextLength(Child(x)) + 1
      Cpt = String$(l, Chr$(32))
      Result = GetWindowText(Child(x), Cpt, l)
      If Result <> 0 Then
        Cpt = Left$(Cpt, Result)
      Else
        Cpt = ""
      End If
      
      
      LB.AddItem Child(x) & " Klasse:" & Class _
                          & "    Caption:" & Cpt
    Next x
  End If
End Function

Public Function EnumChilds(ByVal ChWnd&, ByVal lParam&) As Long
  Child(UBound(Child)) = ChWnd
  ReDim Preserve Child(0 To UBound(Child) + 1)
  EnumChilds = 1
End Function
'---------- Ende Modul "Module1" alias MODULE1.BAS ----------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Bildfeld-Steuerelement "Picture1"
' Steuerelement: Optionsfeld-Steuerelement "Option1"
' Steuerelement: Kontrollkästchen-Steuerelement "Check1"
' Steuerelement: Horizontale Scrollbar "HScroll1"
' Steuerelement: Dateiauswahlliste "File1"
' Steuerelement: Festplattenauswahlliste "Drive1"
' Steuerelement: Vertikale Scrollbar "VScroll1"
' Steuerelement: Verzeichnisauswahlliste "Dir1"
' Steuerelement: Kombinationsliste "Combo1"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"

Option Explicit

Private Sub Form_Load()
  Call Init(Me.hwnd, List1)
  Timer1.Interval = 100
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Dim hFocus&, x%
    hFocus = GetFocus
    If UBound(Child) > 0 Then
      For x = 0 To UBound(Child) - 1
        If Child(x) = hFocus Then
          List1.Selected(x) = True
          Exit For
        Else
          List1.Selected(x) = False
        End If
      Next x
    End If
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von MaxSpeedOne am 05.01.2008 um 00:35

Danke, die Funktion

BrowseCallbackProc
für
.lpfnCallback = GetAddress(AddressOf BrowseCallbackProc)
wurde aus der Klasse in ein Modul verbannt und siehe da nun tut es.

Kommentar von Rick-VB am 31.01.2005 um 21:51

Ist zwar schon ne Zeitlang her, aber vielleicht brauchst Du ja noch die Info:
AddressOf funktioniert nur in normalen Basicmodulen. Innerhalb KLassen geht es nicht. Ich glaube, das hängt mit den Instanzen zusammen, die von Klassen gebildet werden können, weiß es aber nicht genau.

Kommentar von Cornflake am 17.08.2004 um 12:25

Hi Ich habe jetzt mal versucht das ganze in eine klasse als methode einzubauen. Nur jetzt kommt immer die Meldung ungültige verwendung des AdressOf Operators...
Im MSDN habe ich da was gelesen:

|Sie können zwar AddressOf verwenden, um Prozedurzeiger |zwischen Basic-Prozeduren zu übergeben, Sie können mit |Hilfe eines solchen Zeigers jedoch keine Funktion |innerhalb von Basic aufrufen. Das bedeutet, daß z.B. eine |in Basic geschriebeneKlasse mit einem derartigen Zeiger |keinen Rückruf an den zugehörigen Controller durchführen |kann. Wird AddressOf für das Übergeben eines |Prozedurzeigers zwischen Prozeduren innerhalb von Basic |verwendet, muß derParameter der aufgerufenen Prozedur als |As Long eingegeben werden.

Nur ich kapier das nicht...

Kommentar von Cornflake am 17.08.2004 um 12:19

Hi Ich habe jetzt mal versucht das ganze in eine klasse als methode einzubauen. Nur jetzt kommt immer die Meldung ungültige verwendung des AdressOf Operators...
Im MSDN habe ich da was gelesen:

|Sie können zwar AddressOf verwenden, um Prozedurzeiger |zwischen Basic-Prozeduren zu übergeben, Sie können mit |Hilfe eines solchen Zeigers jedoch keine Funktion |innerhalb von Basic aufrufen. Das bedeutet, daß z.B. eine |in Basic geschriebeneKlasse mit einem derartigen Zeiger |keinen Rückruf an den zugehörigen Controller durchführen |kann. Wird AddressOf für das Übergeben eines |Prozedurzeigers zwischen Prozeduren innerhalb von Basic |verwendet, muß derParameter der aufgerufenen Prozedur als |As Long eingegeben werden.

Nur ich kapier das nicht...