2013-06-11 3 views
2

Я довольно новичок в вызовах WinApi, хотя знаком с VBA. Я пытаюсь подключиться к дочернему классу SysTreeView32 окна VBE (Project Explorer TreeView). Я хотел бы расширить/свернуть элементы древовидной структуры, изменив ключи реестра (или, альтернативно, посылая щелчки мыши (mouse_event), хотя я предпочитаю первый вариант).
я могу найти Excel Главное окно с помощью этого кода:
Захват в дочернем классе SysTreeView32 окна VBE

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
       (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 

Sub Find_Window() 
    Dim hWndExcel As Long 
    hWndExcel = FindWindow("XLMAIN", Application.Caption) 
    MsgBox hWndExcel 
End Sub 

С помощью Window Detective я могу получить доступ имена, свойства и т.д. из дочерних классов.
Window Detective child classes
Но я не могу решить, как получить/активировать (или даже вернуть HWID) дочерний класс SysTreeView32, чтобы свернуть/развернуть элементы (папки). Я не уверен, как перебирать элементы, но потом буду изучать их. Проблема здесь в доступе к классу SysTreeView32. Как я могу это достичь?

Когда я пытаюсь MsgBox это
FindWindow("wndclass_desked_gsk", Application.Caption)
или
FindWindow("SysTreeView32", Application.Caption)
0 возвращается, так что я, очевидно, делает что-то неправильно:/
Спасибо за ваше время.

ответ

6

вы должны использовать:

application.vbe.mainwindow.caption 

вот некоторые примеры Распад кода

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 

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) 
    hNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_ROOT, 0&) 
    Do While hNode <> 0 
     varReturn = SendMessage(hWndTvw, TVM_EXPAND, TVE_COLLAPSE, hNode) 
     hNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, hNode) 
    Loop 
End Sub 

далее на Ваш комментарий, вот код разрушаться только Узлов «объектов Microsoft Excel»

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 
Public Declare Function SendMessageB Lib "user32" Alias "SendMessageA" _ 
            (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long 

Private Const MAX_ITEM  As Long = 256 
Private Const TV_FIRST  As Long = &H1100 
Private Const TVM_EXPAND  As Long = (TV_FIRST + 2) 
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10) 
Private Const TVM_GETITEM  As Long = (TV_FIRST + 12) 
Const TVE_COLLAPSE   As Long = &H1 
Const TVE_EXPAND    As Long = &H2 
Private Const TVGN_ROOT  As Long = &H0 
Private Const TVGN_NEXT  As Long = &H1 
Private Const TVIF_TEXT  As Long = &H1 
Private Const TVGN_NEXTVISIBLE = &H6 

Private Type TVITEM ' was TV_ITEM 
    mask      As Long 
    hItem      As Long 
    state      As Long 
    stateMask     As Long 
    pszText     As String 
    cchTextMax     As Long 
    iImage      As Long 
    iSelectedImage    As Long 
    cChildren     As Long 
    lParam      As Long 
End Type 


Sub CollapseXLObjects() 
    Dim hWndVBE    As Long 
    Dim hWndPE     As Long 
    Dim hWndTvw    As Long 
    Dim hNode     As Long 
    Dim tvi     As TVITEM 
    Dim nChild     As Long 
    Dim sText     As String 
    Dim varReturn 

    hWndVBE = FindWindowEx(0, 0, "wndclass_desked_gsk", Application.VBE.MainWindow.Caption) 
    hWndPE = FindWindowEx(hWndVBE, 0, "PROJECT", vbNullString) 
    hWndTvw = FindWindowEx(hWndPE, 0, "SysTreeView32", vbNullString) 

    hNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_ROOT, 0&) 

    Do While hNode <> 0 
     tvi.hItem = hNode 
     tvi.mask = TVIF_TEXT 
     tvi.cchTextMax = MAX_ITEM 
     tvi.pszText = String(MAX_ITEM, 0) 
     nChild = SendMessageB(hWndTvw, TVM_GETITEM, 0&, tvi) 
     If InStr(1, tvi.pszText, "Microsoft Excel Objects", vbTextCompare) > 0 Then 
     varReturn = SendMessage(hWndTvw, TVM_EXPAND, TVE_COLLAPSE, hNode) 
     Else 
     varReturn = SendMessage(hWndTvw, TVM_EXPAND, TVE_EXPAND, hNode) 
     End If 
     hNode = SendMessage(hWndTvw, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, hNode) 
    Loop 
End Sub 
+0

+ ∞ это просто отлично! Мне просто придется изменить его, чтобы свернуть только объекты Microsoft Excel, но я думаю, что смогу самостоятельно управлять им ... ну, я не думаю, что я просто буду играть с ним сейчас, а я не полностью понимая это еще –

+0

, здесь есть хороший источник информации о ТВ: http://btmtz.mvps.org/treeview/ :-) – JosieP

+0

Я обновил код, чтобы проверить текст узла и скрыть объекты excel – JosieP

0

Если вы звоните в эту руга к югу (в моем случае к югу в надстройке XL связан с пользовательской кнопкой, которая открывает VBE), а другой модуль подсвечивается (который может быть в другом проекте), то я нашел

Application.VBE.MainWindow.Caption 

Безразлично Не работай. Для того, чтобы захватить выделенный модуль я использую:

Private Sub VisualBasicEditor() 
     On Error Resume Next 
     WinName = "Microsoft Visual Basic - " + ActiveWorkbook.Name + " [Running] - [" + Application.VBE.ActiveCodePane.CodeModule.Name + " (Code)]" 
     Application.VBE.MainWindow.Visible = True 
     Call CollapseXLObjects 
    End Sub 

и в модуле, содержащем Sub CollapseXLObjects объявить

Public WinName As String 

и в Sub CollapseXLObjects

hWndVBE = FindWindowEx(0, 0, "wndclass_desked_gsk", WinName) 
Смежные вопросы