Автоматизация стороннего приложения - Systreeview32 сообщает о 0 элементах, но имеет узлы - PullRequest
0 голосов
/ 31 мая 2011

Я работаю над автоматизацией нескольких приложений. Одно зависит от выхода другого. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь получить доступ к Treeview для получения дополнительной информации, счетчик возвращает 0.

Если я смотрю на это заметно, на нем довольно много предметов. Если я смотрю на него с помощью Winspector, он сообщает о 0 видимых элементах.

Как я могу собрать эту информацию? Это информация, которая собирается динамически и из нескольких мест. Я не могу получить доступ к базам данных (это было бы неплохо, но поскольку некоторая информация является динамической, это невозможно).

Вот вывод, который мне дает Winspector:

Properties for window: 0x00021806   

Class Name:         SysTreeView32 

Rectangle:          213, 180, 1038, 375 

Size:               825, 195 

Client Rectangle:   0, 0, 821, 191 

Client Size:        821, 191 

Styles:             WS_CHILD,
                    WS_VISIBLE,
                    WS_CLIPSIBLINGS,
                    WS_CLIPCHILDREN,
                    WS_TABSTOP,

StylesEx:           WS_EX_NOPARENTNOTIFY,
                    WS_EX_CLIENTEDGE,
                    WS_EX_LEFT,
                    WS_EX_LTRREADING,
                    WS_EX_RIGHTSCROLLBAR

ID:                 0

Properties:         Atom: #43288 0xFFFFFFFF (-1)

Class specific:     Visible items:0, 
                    Total items: 0
                    Window is Ansi

Owner EXE           c:\csg\acsr\XBOI.EXE

Есть идеи, как я могу получить информацию об узле и элементах? Я использую VBA (доступ) с вызовами API с sendmessage.

Вот мой код, который я использую для проверки количества предметов:

Sub testtree(mytv As Long)

Dim z As Long

Dim wClass As String, wText As String

    Dim hWndTvw  As Long

    Dim hNode As Long

    Dim varReturn As Long

    Dim tvcount As Long

    Dim hchild As Long

    Dim j As Integer

    hchild = mytv

    wClass = Space(64)

    j = GetClassName(hchild, wClass, 63)

    wClass = Left(wClass, j)

    wText = Space(256)

    j = SendMessageS(hchild, WM_GETTEXT, 255, wText)

    wText = Left(wText, j)

    Debug.Print wText

z = SendMessage(mytv, TVM_GETCOUNT, 0&, 0&)

MsgBox z

End Sub

Спасибо!

1 Ответ

1 голос
/ 02 июня 2011

Вы должны рассмотреть возможность использования TVM_GETNEXTITEM сообщения для перечисления узлов дерева: сначала вызовите его с флагом TVGN_ROOT, чтобы получить корневой узел, затем используйте флаги TVGN_CHILD и TVGN_NEXT, чтобы пройти через узлы. Это сообщение возвращает вам дескриптор элемента.

Когда вы получите дескриптор элемента, используйте сообщение TVM_GETITEM , чтобы получить связанные данные, которые вас интересуют (например, текст элемента).

Вы должны внимательно прочитать эти 2 ссылки для получения дополнительной информации об использовании этих сообщений.

P.S. Проблема в том, что в сообщении TVM_GETITEM используется структура TVITEM с указателями, и я не уверен, что его будет легко использовать из VBA (в отличие, например, от C, C ++, даже C # / VB.NET для этого более подходит IMO). В худшем случае (то есть, если вы не знаете что-то о VBA, о котором я не знаю: последний раз, когда я имел дело с VBA, было около 2004 года), вам нужно разработать небольшой COM-объект с использованием C ++ / ATL для этого сингла. Задача, и перераспределить и зарегистрировать его вместе с вашим программным обеспечением. Или поищите сторонние компоненты.

...