从另一个应用程序获取treeview的节点文本

本文关键字:节点 文本 treeview 获取 另一个 应用程序 | 更新日期: 2023-09-27 18:07:14

我一直在努力解决这个问题很长一段时间,我仍然找不到一个像样的文档或例子。

我只是想得到一个树视图的节点文本位于使用WinApi在c#中的另一个应用程序,我找不到这样做的任何地方的方法。

我尝试探索TVM_GETITEM消息,但我无法从中获取TVITEM。

我怎样才能实现这样的事情?

从另一个应用程序获取treeview的节点文本

所以我自己也遇到了这个问题,我想分享一下我的发现。它需要首先获得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。状态值是当它被检查时。

这是一个链接,我从一个试图得到Unicode文本的人那里找到了这个。