先找到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);
回:hbxtlhx关键就是怎样取节点的句柄~懂的话就帮帮我吧!
treeView tree1 = new treeView ("根节点名") 以上是treeView 取得句柄的代码Var tree = new WebFXTree("<%=rootname%>") 以上是WebTree取得句柄的代码其他的跨进程通信的方法你应该解决了吧
你可以参考下面的代码(仅仅参考): 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; }
支持平民百姓,不过是不是应该加上 using System.Runtime.InteropServices?
不要这么复杂,用remoting就可以搞定了,两个程序建立连接,然后弄了监测线程就可以了
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(); }谢谢各位捧场哈
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);
}
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);
以上是treeView 取得句柄的代码Var tree = new WebFXTree("<%=rootname%>")
以上是WebTree取得句柄的代码其他的跨进程通信的方法你应该解决了吧
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;
}
using System.Runtime.InteropServices?
{
#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>
/// <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();
}谢谢各位捧场哈