01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 |
|
Option Explicit
Private Declare PtrSafe Function FindWindowA Lib "user32" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function FindWindowExA Lib "user32" ( _
ByVal hWndParent As LongPtr, ByVal hWndChildAfter As LongPtr, _
ByVal lpszClass As String, ByVal lpszWindow As String) As LongPtr
Private Declare PtrSafe Function SendMessageA Lib "user32" ( _
ByVal hWnd As LongPtr, ByVal Msg As Long, _
ByVal wParam As LongPtr, lParam As Any) As LongPtr
' Konstanten für TreeView-Operationen
Const TV_FIRST As Long = &H1100
Const TVM_GETCOUNT As Long = TV_FIRST + 5
Const TVM_GETNEXTITEM As Long = TV_FIRST + 10
Const TVM_GETITEM As Long = TV_FIRST + 12
Const TVGN_ROOT As Long = &H0
Const TVGN_CHILD As Long = &H4
Const TVGN_NEXT As Long = &H1
Type TVITEM
mask As Long
hItem As LongPtr
STATE As Long
statemask As Long
pszText As String
cchTextMax As Long
iImage As Long
iSelectedImage As Long
cChildren As Long
lParam As LongPtr
End Type
Sub EnumerateTreeView()
Dim hWnd As LongPtr, hTree As LongPtr, hItem As LongPtr
Dim TVI As TVITEM
Dim iZeile As Long, iAnz As Long, iAnzMax As Long
' Fenster "Diff" suchen
hWnd = FindWindowA(vbNullString, "Diff")
If hWnd = 0 Then
MsgBox "Fenster mit Titel ' Diff' nicht gefunden!", vbCritical, "TreeView""
Exit Sub
End If
' TreeView vorhanden?
hTree = FindWindowExA(hWnd, 0, "SysTreeView32", vbNullString)
If hTree = 0 Then
MsgBox "Fenster enthält kein TreeView-Steuerelement!"
Exit Sub
End If
' Root-Knoten abrufen
hItem = SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&)
If hItem = 0 Then
MsgBox "Kein Root-Knoten gefunden!", vbCritical, "TreeView"
Exit Sub
End If
iAnzMax = CLng(SendMessageA(hTree, TVM_GETCOUNT, 0, ByVal 0&)) ' Anzahl der Elemente
' Elemente durchgehen
Do While hItem <> 0
With TVI ' TVITEM initialisieren
.mask = &H1 ' &H1 = TVIF_TEXT
.hItem = hItem
.pszText = String(256, vbNullChar) ' Puffer initialisieren
.cchTextMax = 256
If SendMessageA(hTree, TVM_GETITEM, 0, TVI) <> 0 Then
' Knoteninformationen in die Tabelle schreiben
Cells(iZeile + 1, 5).Value = Left(.pszText, InStr(.pszText, vbNullChar) - 1)
iZeile = iZeile + 1
Else
Debug.Print "Fehler beim Abrufen des Items: " & hItem
End If
End With
' Nächsten Knoten abrufen
hItem = SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_NEXT, ByVal hItem)
Loop
MsgBox iZeile & " von" & Str(iAnzMax) & _
" Elementen wurden in Spalte E eingefügt!", vbInformation, "TreeView"
End Sub
|