C#下用API跨进程控制别的窗体的TreeView

using System.Text;
using System;
using System.Runtime.InteropServices;
class API
{
    #region   "API函数定义 "
    [DllImport("user32.dll ", CharSet = CharSet.Unicode)]
    private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lparam);
    [DllImport("user32.dll ", CharSet = CharSet.Unicode)]
    private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, TVITEM lparam);
    [DllImport("user32.dll ")]
    public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
    [DllImport("user32.dll ")]
    public static extern int EnumChildWindows(int hWndParent, MyCallBack lpfn, StringBuilder value);
    [DllImport("user32.dll ")]
    public static extern int GetClassNameA(int hwnd, StringBuilder lpClassName, int nMaxCount);
    [DllImport("kernel32 ", CharSet = CharSet.Unicode)]
    public static extern int CopyMemory(StringBuilder Destination, IntPtr Source, int Length);
    [DllImport("kernel32 ", CharSet = CharSet.Unicode)]
    public static extern int GlobalAlloc(int wFlags, int dwBytes);
    [DllImport("kernel32 ", CharSet = CharSet.Unicode)]
    public static extern int GlobalFree(IntPtr hMem);
    #endregion

    #region   "常量定义 "
    private const int TVGN_CARET = 0x00000009;
    private const int TVM_SELECTITEM = 0x0000110b;
    private const int TVGN_ROOT = 0x00000000;
    private const int TVM_GETNEXTITEM = 0x0000110a;
    private const int TVIF_TEXT = 0x0001;
    private const int TVGN_NEXT = 0x00000001;
    private const int TVM_GETITEM = 0x0000110c;
    private const int TVGN_CHILD = 0x00000004;
    private const int GMEM_FIXED = 0x0000;
    #endregion
    ///   <summary> 
    ///   选取TreeView指定项 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "ItemHwnd "> 节点对象句柄 </param> 
    ///   <returns> 成功选中返回true   没找到返回false </returns> 
    public static bool SelectNode(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
    {
        int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_SELECTITEM, new IntPtr(TVGN_CARET), ItemHwnd);
        if (result == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    ///   <summary> 
    ///   获取TreeView根节点 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <returns> 成功返回根节点句柄   否则返回   0 </returns> 
    public static IntPtr GetRoot(IntPtr TreeViewHwnd)
    {
        TVITEM tv = new TVITEM();
        IntPtr hStr = Marshal.AllocHGlobal(1024);
        tv.hItem = TreeViewHwnd;
        tv.mask = TVIF_TEXT;
        tv.pszText = hStr;
        tv.cchTextMax = 1024;
        int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_ROOT), tv);
        Marshal.FreeHGlobal(hStr);
        return new IntPtr(result);
    }
    ///   <summary> 
    ///   获取同级下一节点句柄 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "PrevHwnd "> 上一项节点句柄 </param> 
    ///   <returns> 成功返回下一项节点句柄   否则返回   0 </returns> 
    public static IntPtr GetNextItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
    {
        int mbHwnd = 0;
        mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_NEXT), PrevHwnd);
        return new IntPtr(mbHwnd);
    }
    ///   <summary> 
    ///   获取第一个子节点句柄 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "ParentHwnd "> 父节点句柄 </param> 
    ///   <returns> 成功返回第一个子节点句柄   否则返回   0 </returns> 
    public static IntPtr GetFirstChildItem(IntPtr TreeViewHwnd, IntPtr ParentHwnd)
    {
        int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_CHILD), ParentHwnd);
        return new IntPtr(result);
    }
    ///   <summary> 
    ///   获取指定项文本 
    ///   </summary> 
    ///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
    ///   <param   name= "ItemHwnd "> 节点句柄 </param> 
    ///   <returns> </returns> 
    public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
    {
        StringBuilder sb = new StringBuilder(1024);
        int hStr = GlobalAlloc(GMEM_FIXED, 1024);
        if (hStr > 0)
        {
            TVITEM tv = new TVITEM();
            tv.mask = TVIF_TEXT;
            tv.HTreeItem = ItemHwnd.ToInt32();
            tv.pszText = new IntPtr(hStr);
            tv.cchTextMax = 1023;
            int i = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, IntPtr.Zero, tv);
            int iCopy = CopyMemory(sb, new IntPtr(hStr), 1024);
            GlobalFree(new IntPtr(hStr));
        }
        return sb.ToString();
    }
}
///   <summary> 
///   TV_ITEM结构 
///   </summary> 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class TVITEM
{
    public int mask;
    public IntPtr hItem;
    public int state;
    public int stateMask;
    public IntPtr pszText;
    public int cchTextMax;
    public int iImage;
    public int iSelectedImage;
    public int cChildren;
    public IntPtr lParam;
    public int HTreeItem;
}

下面是补充上面的取节点文本的
复制  保存
///   <summary> 
///   获取指定项文本 
///   </summary> 
///   <param   name= "TreeViewHwnd "> 树对象句柄 </param> 
///   <param   name= "ItemHwnd "> 节点句柄 </param> 
///   <returns> </returns> 
public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
{
    IntPtr hStr = Marshal.AllocHGlobal(1024);
    TVITEM tv = new TVITEM();
    tv.hItem = ItemHwnd;
    tv.mask = TVIF_TEXT;
    tv.pszText = hStr;
    tv.cchTextMax = 1024;
    StringBuilder sb = new StringBuilder(1024);
    int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, new IntPtr(0), tv);
    int iCopy = CopyMemory(sb, hStr, 1024);
    Marshal.FreeHGlobal(hStr);
    return sb.ToString();
}
posted @   94cool  阅读(1109)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2009年9月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 1 2 3
4 5 6 7 8 9 10
点击右上角即可分享
微信分享提示