2013-04-03 104 views
3

我一直在努力解决这个问题相当长的时间,我仍然无法找到一个体面的文档或这个问题的例子。从另一个应用程序获取treeview的节点文本

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

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

我该怎么做到这样的事情?

+0

你是用C#编写代码.. /如果不是为什么..?如果您有任何现有的代码,使用本地语言/ .net框架相当简单,请显示您到目前为止的内容 – MethodMan 2013-04-03 22:26:47

+1

您是在*您自己的应用程序*还是在另一个应用程序中与TreeView控件进行交互*?如果它是前者,那么'TreeView.Node.Text'有什么问题? – 2013-04-03 22:30:38

+0

我编辑了问题的内容。它现在指定树视图在另一个应用程序上,我只想获取选定的节点文本。 – 2013-04-04 07:10:41

回答

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 
} 

你可以同样地厕所k在TVITEM的状态下确定节点是否被检查。 TV_CHECKED常量(8192)适用于我,但我会在运行时检查它是否检查TVITEM.state值。

Here是我从其他人试图将文本恢复为Unicode的地方找到的链接。

相关问题