C#下用API 跨进程控制别的窗体的TreeView节点的展开与点击

sbshu 2007-03-16 02:58:48
如何在C#下用API 跨进程控制别的窗体的TreeView节点的展开与点击.
网上搜索是用SendMessage来实现,可是具体不知道怎样写!

高手帮帮忙啊!!
...全文
1663 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
王者永乐 2012-06-19
  • 打赏
  • 举报
回复
为什么我用你的方法还是获取到的乱码啊
sbshu 2007-03-19
  • 打赏
  • 举报
回复
终于解决了

下面是补充上面的取节点文本的

/// <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();
}

谢谢各位捧场哈
jjyjjyjjy 2007-03-19
  • 打赏
  • 举报
回复
UP
sbshu 2007-03-19
  • 打赏
  • 举报
回复
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;
}


取是可以取得到了
可是取出来的是乱码,唉....
谢谢平民百姓的帮忙
帖子晚上来结
Lover211 2007-03-18
  • 打赏
  • 举报
回复
可以结了,答案很明朗了!
wenbin0727 2007-03-18
  • 打赏
  • 举报
回复
Mark!
ericksky 2007-03-18
  • 打赏
  • 举报
回复
学习
hongyelzg 2007-03-18
  • 打赏
  • 举报
回复
不要这么复杂,用remoting就可以搞定了,两个程序建立连接,然后弄了监测线程就可以了
LV_Q 2007-03-18
  • 打赏
  • 举报
回复
mark
fenghao_5555 2007-03-17
  • 打赏
  • 举报
回复
帮顶
medal_kucao 2007-03-17
  • 打赏
  • 举报
回复
支持平民百姓,不过是不是应该加上
using System.Runtime.InteropServices?
fancystyle 2007-03-17
  • 打赏
  • 举报
回复
帮顶,主要是我也不懂WIN32编程.如果懂就好使了
tianxingzh 2007-03-16
  • 打赏
  • 举报
回复
顶+学习!
路飞 2007-03-16
  • 打赏
  • 举报
回复
不明白...
crazy7 2007-03-16
  • 打赏
  • 举报
回复
UP
lovevsnet 2007-03-16
  • 打赏
  • 举报
回复
好贴,没空写代码,帮顶
觉得平民百姓写得不错,或许能行
lr21shiji 2007-03-16
  • 打赏
  • 举报
回复
帮顶
王集鹄 2007-03-16
  • 打赏
  • 举报
回复
路过
北京的雾霾天 2007-03-16
  • 打赏
  • 举报
回复
你可以参考下面的代码(仅仅参考):
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;
}
leixueqiyi 2007-03-16
  • 打赏
  • 举报
回复
treeView tree1 = new treeView ("根节点名")
以上是treeView 取得句柄的代码

Var tree = new WebFXTree("<%=rootname%>")
以上是WebTree取得句柄的代码

其他的跨进程通信的方法你应该解决了吧
加载更多回复(11)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧