如何在C#下用API 跨进程控制别的窗体的TreeView节点的展开与点击.
网上搜索是用SendMessage来实现,可是具体不知道怎样写!高手帮帮忙啊!!

解决方案 »

  1.   

    你只要知道那个进程中的TreeView的句柄,且知道是第几个节点,就可以用如下的方法来展开这个节点(方法中只限第一层切点,如果要其它层的可以按索引再修改,这只是个参考):[DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
    private void button4_Click(object sender, EventArgs e)
    {
    ExpandNode(2);
    }
    private void ExpandNode(int index)
    {
    SendMessage(this.treeView1.Handle, 0x1102, 2, this.treeView1.Nodes[index].Handle);
    }
      

  2.   

    把上面的this.treeView1.Handle换成相应的句柄就可以了。
      

  3.   

    先找到TreeView对象句柄TreeViewHwnd//TVITEM结构体
        public struct 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;
        }  private const int TVM_GETITEM = 4364;
    private const int TVIF_TEXT = 1;//声明全局内存
    IntPtr hStr= Marshal.AllocHGlobal(1023);
    //TVITEM类型参数
    TVITEM tv=new TVITEM();
    //设置参数
    tv.mask=TVIF_TEXT;
    tv.hItem = TreeViewHwnd;
    tv.pszText = hStr.ToInt32();
    tv.cchTextMax = 1024;
    //发送消息
    SendMessage(TreeViewHwnd,LVM_GETITEM,0,tv);//===============================================
    //操作上面声明的那个内存,不知道要怎样做了.
    //===============================================//释放全局内存
    Marshal.FreeHGlobal(hStr);
      

  4.   

    回:hbxtlhx关键就是怎样取节点的句柄~懂的话就帮帮我吧!
      

  5.   

    treeView tree1 = new treeView ("根节点名")
    以上是treeView 取得句柄的代码Var tree = new WebFXTree("<%=rootname%>")
    以上是WebTree取得句柄的代码其他的跨进程通信的方法你应该解决了吧
      

  6.   

    你可以参考下面的代码(仅仅参考):
    private void button1_Click(object sender, EventArgs e)
    {
    IntPtr ptr = (IntPtr)int.Parse(this.textBox1.Text, System.Globalization.NumberStyles.HexNumber);
    POINT pt = new POINT(Control.MousePosition);
    int i = ScreenToClient(ptr, pt);
    IntPtr handle = GetNodeAt(ptr, pt.X, pt.Y);//按位置获取鼠标下节点
    if (handle != null)
    {
    SendMessage(ptr, 0x1102, 2, handle);//展开节点
    }
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class TV_HITTESTINFO
    {
    public int pt_x;
    public int pt_y;
    public int flags;
    public IntPtr hItem;
    public TV_HITTESTINFO()
    {
    this.hItem = IntPtr.Zero;
    }
    }
    [StructLayout(LayoutKind.Sequential)]
    public class POINT
    {
    public int X;
    public int Y;
    public POINT(Point pt)
    {
    this.X = pt.X;
    this.Y = pt.Y;
    }
    public POINT(int x, int y)
    {
    this.X = x;
    this.Y = y;
    }
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, TV_HITTESTINFO lParam);
    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern int ScreenToClient(IntPtr hWnd, [In, Out] POINT pt);
    public IntPtr GetNodeAt(IntPtr tvwPtr, int x, int y)
    {
    TV_HITTESTINFO lParam = new TV_HITTESTINFO();
    lParam.pt_x = x;
    lParam.pt_y = y;
    IntPtr handle = SendMessage(tvwPtr, 0x1111, 0, lParam);
    return handle;
    }
      

  7.   

    支持平民百姓,不过是不是应该加上
    using System.Runtime.InteropServices?
      

  8.   

    不要这么复杂,用remoting就可以搞定了,两个程序建立连接,然后弄了监测线程就可以了
      

  9.   

    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;
        }  
    取是可以取得到了
    可是取出来的是乱码,唉....
    谢谢平民百姓的帮忙
    帖子晚上来结
      

  10.   

    终于解决了下面是补充上面的取节点文本的        /// <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();
            }谢谢各位捧场哈