2013-06-11 2 views
3

Это следующие Hook into a child class SysTreeView32 of VBE window

мой следующий вопрос, который я могу получить доступ к SysTreeView32 сейчас, но я не могу получить доступ к дочернему узлу hNode. Я пробовал много вариаций и читал об этом последние 2 часа, но я не могу это решить. Возможно ли это? Я действительно хочу избежать mouse_event и щелкнуть из-за разных размеров и положения окна, но если это единственный способ, я попытаюсь реализовать это.доступ дочерних узлов SysTreeView32

Heres код:

Option Explicit 

Private Const TVE_COLLAPSE = &H1 
Private Const TVE_COLLAPSERESET = &H8000 
Private Const TVE_EXPAND = &H2 
Private Const TVE_EXPANDPARTIAL = &H4000 
Private Const TVE_TOGGLE = &H3 
Private Const TV_FIRST = &H1100 
Private Const TVM_EXPAND = (TV_FIRST + 2) 
Private Const TVM_GETNEXTITEM = (TV_FIRST + 10) 
Private Const TVGN_ROOT = &H0 
Private Const TVGN_NEXTVISIBLE = &H6 
Private Const TVGN_CHILD = 4 

Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ 
           (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long 
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
            (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 

Sub CollapseProjects() 
    Dim hWndVBE As Long, hWndPE As Long, hWndTvw As Long, hNode As Long, varReturn 
    hWndVBE = FindWindowEx(0, 0, "wndclass_desked_gsk", Application.VBE.MainWindow.Caption) 
    hWndPE = FindWindowEx(hWndVBE, 0, "PROJECT", vbNullString) 
    hWndTvw = FindWindowEx(hWndPE, 0, "SysTreeView32", vbNullString) 

    Dim childNode As Long 
    hNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_ROOT, 0&) 
    childNode = SendMessage(hNode, TVM_GETNEXTITEM, 0&, 0&) 
    Debug.Print "childNode " & childNode 

    Do While hNode <> 0 
     Debug.Print hNode 
     varReturn = SendMessage(hWndTvw, TVM_EXPAND, TVE_COLLAPSE, hNode) 
     hNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, hNode) 
    Loop 
End Sub 

и почему

childNode = SendMessage(hNode, TVM_GETNEXTITEM, 0&, 0&) 
Debug.Print "childNode " & childNode 

всегда возвращать 0?

ответ

1

Это:

childNode = SendMessage(hNode, TVM_GETNEXTITEM, 0&, 0&) 

не просит дочернего узла. Во-первых, вы отправляете сообщение на hNode, а не на дерево управления, которое не имеет никакого смысла. Затем, чтобы получить дочерний узел, вам необходимо передать флаг TVGN_CHILD, который равен 0x4, в wParam. Вам также необходимо передать элемент, в котором вы хотите, чтобы ребенок находился в lParam.

Так что вероятно, будет выглядеть примерно так:

childNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_CHILD, hNode) 

Смотрите docs для TVM_GETNEXTITEM сообщения для получения дополнительной информации.

+0

Спасибо, Джонатан! –

Смежные вопросы