3

これは、 VBE ウィンドウの子クラス SysTreeView32 にフックするに続く次の質問

です。今は SysTreeView32 にアクセスできますが、hNode の子ノードにはアクセスできません。私は多くのバリエーションを試し、過去 2 時間それについて読んでいますが、解決できません。これは可能ですか?ウィンドウのサイズと位置が異なるため、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を返しますか?

4

1 に答える 1

1

これ:

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

子ノードを要求していません。まず、ツリー コントロールではなく にメッセージを送信しているためhNode、まったく意味がありません。次に、子ノードを取得するには、TVGN_CHILDフラグ 0x4 をに渡す必要がありますwParam。の子にしたい項目も渡す必要がありますlParam

したがって、おそらく次のようになります。

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

詳細については、メッセージのドキュメントを参照してください。TVM_GETNEXTITEM

于 2013-06-11T13:24:39.063 に答える