Так что я столкнулся с этой проблемой и подумал, что поделюсь тем, что нашел. Для этого требуется сначала получить дескриптор IntPtr элемента управления TreeView, поэтому в этом примере предполагается, что часть выполнена.
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 является ссылкой на то, где я нашел это от кого-то, пытающегося вернуть текст в Юникоде.
Вы пишете код в C# ../если не почему ..? это довольно просто сделать с использованием среды родного языка/.net, также если у вас есть какой-либо существующий код, пожалуйста, покажите, что у вас есть до сих пор – MethodMan
Вы взаимодействуете с элементом управления TreeView в * своем собственном приложении * или в другом приложении *? Если это первое, что случилось с 'TreeView.Node.Text'? –
Я отредактировал содержание вопроса. Теперь он указывает, что treeview находится в другом приложении, и я просто хочу получить выбранный текст узла. –