0

我正在努力自动化几个应用程序。一个取决于另一个的输出。我遇到的问题是,当我尝试访问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

有什么想法可以检索节点信息和项目吗?我正在使用带有发送消息的 API 调用的 VBA(访问)。

这是我用来测试项目计数的代码:

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

谢谢!

4

1 回答 1

1

您应该考虑使用TVM_GETNEXTITEM消息来枚举树的节点:首先使用 TVGN_ROOT 标志调用它以获取根节点,然后使用 TVGN_CHILD 和 TVGN_NEXT 标志遍历节点。此消息返回项目的句柄。

当您获得项目的句柄后,使用TVM_GETITEM消息检索您感兴趣的相关数据(例如项目的文本)。

您应该仔细阅读这 2 个链接以获取有关使用该消息的更多信息。

PS 问题是,TVM_GETITEM 消息使用带有指针的 TVITEM 结构,我不确定它是否易于从 VBA 中使用(不像 C、C++,甚至 C#/VB.NET 更适合 IMO) . 在最坏的情况下(即除非您对我不知道的 VBA 有所了解:上次我处理 VBA 是在 2004 年左右),您需要使用 C++/ATL 为这个单一的开发一个小型 COM 对象任务,并将其与您的软件一起重新分发和注册。或者寻找第 3 方组件。

于 2011-06-02T15:20:10.220 回答