3

私はこの問題にかなり長い間苦労してきましたが、この問題に関する適切なドキュメントや例はまだ見つかりません。

C# で WinApi を使用して、別のアプリケーションにあるツリー ビューのノード テキストを取得しようとしているだけで、どこでもそれを行う方法が見つかりません。

TVM_GETITEM メッセージを調べてみましたが、TVITEM を取得できませんでした。

どうすればそのようなことを達成できますか?

4

1 に答える 1

0

だから私は自分でこの問題に遭遇し、私が見つけたものを共有したいと思った. 最初に TreeView コントロールの IntPtr ハ​​ンドルを取得する必要があるため、この例ではその部分が完了していることを前提としています。

private string getTVNodeText(IntPtr tvHandle, IntPtr nodeHandle)
{

    TVITEM tvi = new TVITEM();
    IntPtr pszText = LocalAlloc(0x40, 260);

    tvi.mask = TreeViewMsg.TVIF_TEXT;
    tvi.hItem = nodeHandle;
    tvi.cchTextMax = 260;
    tvi.pszText = Convert.ToInt32(pszText);

    SendMessageTVI(tvHandle, TreeViewMsg.TVM_GETITEM, 0, tvi);
    string nodeText = Marshal.PtrToStringAnsi((IntPtr)tvi.pszText, 260);

    LocalFree(pszText);

    return nodeText;
}

必要な PInvoke 宣言は次のとおりです。

[DllImport("user32", EntryPoint = "SendMessageW")]
public int SendMessageTVI(IntPtr hWnd, int wMsg, int wParam, ref TVITEM tvi { }

[DllImport("kernel32.dll")]
public IntPtr LocalAlloc(uint flags, uint cb) { }

[DllImport("kernel32.dll")]
public IntPtr LocalFree(IntPtr p) { }

これがTVITEM構造です

public struct TVITEM
{
    public int mask;
    public int hItem;
    public int state;
    public int stateMask;
    public int pszText;
    public int cchTextMax;
    public int iImage;
    public int iSelectedImage;
    public int cChildren;
    public int lParam;
    public int iIntegral;
}

SendMessage 呼び出しの定数は次のとおりです。

[Flags()]
public enum TreeViewMsg
{
    BN_CLICKED = 0xf5,
    TV_CHECKED = 0x2000,
    TV_FIRST = 0x1100,
    TVGN_ROOT = 0x0,
    TVGN_NEXT = 0x1,
    TVGN_CHILD = 0x4,
    TVGN_FIRSTVISIBLE = 0x5,
    TVGN_NEXTVISIBLE = 0x6,
    TVGN_CARET = 0x9,
    TVM_SELECTITEM = (TV_FIRST + 11),
    TVM_GETNEXTITEM = (TV_FIRST + 10),
    TVM_GETITEM = (TV_FIRST + 12),
    TVIF_TEXT = 0x1
}

同様に、TVITEM の状態を調べて、ノードがチェックされているかどうかを判断できます。TV_CHECKED 定数 (8192) はうまくいきましたが、実行時にこれを調べて、チェックされたときの TVITEM.state の値を確認します。

これは、テキストを Unicode に戻そうとした人から見つけた場所へのリンクです。

于 2015-05-03T15:05:16.623 に答える