2013-04-03 4 views
3

Я долгое время боролся с этой проблемой, и я до сих пор не могу найти достойную документацию или пример по этому вопросу.Получить текст дерева дерева из другого приложения

Я просто пытаюсь получить текст узла древовидного изображения, расположенный в другом приложении, используя WinApi на C#, и я не могу найти способ сделать это где угодно.

Я попытался изучить сообщение TVM_GETITEM, но я не смог получить из него TVITEM.

Как я могу достичь такого?

+0

Вы пишете код в C# ../если не почему ..? это довольно просто сделать с использованием среды родного языка/.net, также если у вас есть какой-либо существующий код, пожалуйста, покажите, что у вас есть до сих пор – MethodMan

+1

Вы взаимодействуете с элементом управления TreeView в * своем собственном приложении * или в другом приложении *? Если это первое, что случилось с 'TreeView.Node.Text'? –

+0

Я отредактировал содержание вопроса. Теперь он указывает, что treeview находится в другом приложении, и я просто хочу получить выбранный текст узла. –

ответ

0

Так что я столкнулся с этой проблемой и подумал, что поделюсь тем, что нашел. Для этого требуется сначала получить дескриптор 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 является ссылкой на то, где я нашел это от кого-то, пытающегося вернуть текст в Юникоде.

Смежные вопросы