Hallo,
ich habe mich mit dem TreeView noch nicht näher beschäftigt, was ich jetzt aber nachholen werde. Wird aber dauern.
Unten ein Beispiel, was nicht abstürtzt und einen Text holt. Leider wird nur ein Item geholt, warum weiß ich noch nicht.
Da ich DIFF nicht habe, habe ich es mit dem VBE-Tree probiert. Du kannst ja mal mit DIFF weitertüfteln
Der ganzen andere Kram, den Du da hattest, ist m.E. überflüssig. Aber das musst Du wissen.
BTW: Vergiss PostMessage. Ich verwende das nur zum Schließen von Fenstern. Die Message wird in die Warteschleife eingestellt und irgendwann mal abgarbeitet.
Für das Steuern und Auslesen von Childwindows (Button, Edit, Combo usw.) solltest Du ausschließlich SendMessage verwenden, die wird sofort verarebitet.
Code:
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 |
|
' API-Deklarationen
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_GETNEXTITEM As Long = TV_FIRST + 10
Const TVM_GETITEM As Long = TV_FIRST + 12
Const TVGN_ROOT As Long = &H0
Const TVGN_NEXT As Long = &H1
Const TVIF_TEXT As Long = &H1
' TreeView-Item Struktur
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, hItem As LongPtr
Dim TVI As TVITEM
Dim iZeile As Long
' Fenster "Diff" suchen
' hWnd = FindWindowA(vbnullstring, "Diff")
hWnd = FindWindowA("wndclass_desked_gsk", vbNullString) ' Handle des VBE-Editor holen
hWnd = FindWindowExA(hWnd, 0, "PROJECT", vbNullString)
If hWnd = 0 Then
MsgBox "Fenster mit Titel ' Diff' nicht gefunden!", vbCritical, "TreeView""
Exit Sub
End If
' TreeView vorhanden?
hWnd = FindWindowExA(hWnd, 0, "SysTreeView32", vbNullString)
If hWnd = 0 Then
MsgBox "Fenster enthält kein TreeView-Steuerelement!"
Exit Sub
End If
' Root-Knoten abrufen
hItem = SendMessageA(hWnd, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&)
If hItem = 0 Then
MsgBox "Kein Root-Knoten gefunden!", vbCritical, "TreeView"
Exit Sub
End If
Do While hItem <> 0
With TVI ' TVITEM initialisieren
.mask = TVIF_TEXT ' und Knoteninformationen abrufen
.hItem = hItem
.pszText = String(256, vbNullChar) ' Puffer initialisieren
.cchTextMax = 256
If SendMessageA(hWndTree, 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 Knotens: " & hItem
End If
End With
' Nächsten Knoten abrufen
hItem = SendMessageA(hWnd, TVM_GETNEXTITEM, TVGN_NEXT, hItem)
Loop
MsgBox "Fertig! Knoten wurden ab Spalte E eingefügt."
End Sub
|
_________
viele Grüße
Karl-Heinz
|