api - 访问SysTreeView32的子节点

标签 api winapi vba parent-child treeviewitem

这是我继Hook into a child class SysTreeView32 of VBE window之后的下一个问题

我现在可以访问SysTreeView32,但无法访问hNode的子节点。我尝试了很多变体,并在过去的两个小时内阅读了相关内容,但我无法解决。这可能吗?由于窗口尺寸和位置不同,我真的想避免 mouse_event 和单击,但如果这是唯一的方法,那么我将尝试实现它。

代码如下:

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?

最佳答案

这个:

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

不要求子节点。首先,您将消息发送到 hNode,而不是树控件,这根本没有意义。然后,要获取子节点,需要在wParam中传递TVGN_CHILD标志,即0x4。您还需要在 lParam 中传递您想要子项的项目。

所以它可能看起来像这样:

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

请参阅docs查看 TVM_GETNEXTITEM 消息以了解更多信息。

关于api - 访问SysTreeView32的子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17043924/

相关文章:

arrays - 如何添加数组?

java - 是否可以将文件从 Java 服务器流式传输到 OpenStack Swift?

delphi - 将 Ctrl+Key 发送到第三方应用程序

c++ - 需要 Volume Shadow Copy API 来卡住 Exchange Writers

c++ - 将成员函数直接链接到 header 中声明的 C 方法

excel - VBA Excel 数据表单不显示正确的输入和字段

vba - 删除名称类似的工作表

java - 如何在 Java 中使用 C API?杰尼?

java - 如何使用 JsonReader 解析嵌套的键和值?

api - 构建 API URL : subdomain vs. 子目录和版本控制的不同方法之间的权衡是什么?