0

私はいくつかのアプリケーションを自動化するために取り組んでいます。1つは別の出力に依存します。私が直面している問題は、にアクセスし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

ありがとう!

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 オブジェクトを開発する必要があります。タスクを作成し、ソフトウェアとともに再配布および登録します。または、サードパーティのコンポーネントを探します。

于 2011-06-02T15:20:10.220 に答える