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