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

时间:2013-04-03 22:18:09

标签: c# winapi text treeview

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

我只是试图在C#中使用WinApi获取位于另一个应用程序上的树视图的节点文本,但我找不到在任何地方执行此操作的方法。

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

我怎样才能实现这样的目标?

1 个答案:

答案 0 :(得分:0)

所以我自己遇到了这个问题,并且认为我分享了我发现的东西。它需要首先获取TreeView控件的IntPtr句柄,因此本示例假定部件已完成。

[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) { }

以下是您需要的PInvoke声明:

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;
}

这是TVITEM结构

[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
}

以下是SendMessage调用的常量

{{1}}

您可以类似地查看TVITEM的状态以确定是否检查了节点。 TV_CHECKED常量(8192)对我有用,但是我在运行时检查它以查看TVITEM.state值在检查时的含义。

Here是指向试图以Unicode格式返回文本的人发现此内容的链接。