gpt4 book ai didi

c# - 从另一个应用程序获取 TreeView 的节点文本

转载 作者:行者123 更新时间:2023-11-30 18:34:46 24 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了很长时间,但我仍然找不到关于这个问题的合适的文档或示例。

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

我尝试探索 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
}

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

Here是我从试图以 Unicode 格式恢复文本的人那里找到的链接。

关于c# - 从另一个应用程序获取 TreeView 的节点文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com