2013-04-03 68 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的地方找到的鏈接。

相關問題