我正在努力自动化多个应用程序。一个取决于另一个的输出。
我遇到的问题是,当我尝试访问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
我有什么想法可以检索节点信息和项目? 我正在使用带有sendmessage的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
谢谢!
答案 0 :(得分:1)
您应该考虑使用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年),你需要使用C ++ / ATL为这个开发一个小的COM对象任务,和redistrubute&将其与您的软件一起注册。或者寻找第三方组件。