VB 5/6-Tipp 0215: Child-Windows enummerieren
von ActiveVB
Beschreibung
Controls sind Childs/KinderFenster eines Parents/ElternFensters. Welche auf letzterem so rumsitzen läßt sich mit diesem Tip herausfinden
Schwierigkeitsgrad: | Verwendete API-Aufrufe: EnumChildWindows, GetClassNameA (GetClassName), GetFocus, GetWindowTextA (GetWindowText), GetWindowTextLengthA (GetWindowTextLength) | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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
BrowseCallbackProcfü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...