3
我一直在努力解决这个问题相当长的时间,我仍然无法找到一个体面的文档或这个问题的例子。从另一个应用程序获取treeview的节点文本
我只是想获得位于使用C#中的WinApi的另一个应用程序的树视图的节点文本,我找不到在任何地方做到这一点的方式。
我尝试过探索TVM_GETITEM消息,但无法获取TVITEM。
我该怎么做到这样的事情?
我一直在努力解决这个问题相当长的时间,我仍然无法找到一个体面的文档或这个问题的例子。从另一个应用程序获取treeview的节点文本
我只是想获得位于使用C#中的WinApi的另一个应用程序的树视图的节点文本,我找不到在任何地方做到这一点的方式。
我尝试过探索TVM_GETITEM消息,但无法获取TVITEM。
我该怎么做到这样的事情?
所以我自己遇到了这个问题,并认为我会分享我发现的东西。它需要首先获取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的地方找到的链接。
你是用C#编写代码.. /如果不是为什么..?如果您有任何现有的代码,使用本地语言/ .net框架相当简单,请显示您到目前为止的内容 – MethodMan 2013-04-03 22:26:47
您是在*您自己的应用程序*还是在另一个应用程序中与TreeView控件进行交互*?如果它是前者,那么'TreeView.Node.Text'有什么问题? – 2013-04-03 22:30:38
我编辑了问题的内容。它现在指定树视图在另一个应用程序上,我只想获取选定的节点文本。 – 2013-04-04 07:10:41