下面这个贴的原代码用来获取同一个程序中的Treeview中各节点的标题没有问题,但是当我试图用这方法去获取另外一个程序上的Treeview的节点的标题时,却没能返回想要的结果,而是诸如x?、^p之类的象是乱码一样的东西,是不是CopyMemory函数只能复制同一个线程内的内存?
参考资料:http://search.csdn.net/Expert/topic/1717/1717633.xml?temp=1.174563E-02请问,在已经得到另外一个程序的Treeview控件及其节点的句柄的情况下,怎么才能得到该节点的标题(文本)。请大家不吝赐教!

解决方案 »

  1.   

    我仔细拜读过zyl910 (910:分儿,我又来了!) 的这个关于treeview的帖子:http://search.csdn.net/Expert/topic/698/698548.xml?temp=.7382929,在他最后给出的程序代码中,似乎还是不能获得treeview节点的标题文本。
      

  2.   

    如果不在同一进程中,返回的pszText可能是另一进程的地址,用OpenProcess和ReadProcessMemory估计可以得到字符串的值。
      

  3.   

    谢谢 cuilonggang的回答,我用OpenProcess和ReadProcessMemory试了一下,还是不能得到正确的结果,用ReadProcessMemory得到的结果和原来程序中Copymemory得到的结果不一样。
    现在我说一下程序的最新症状:
    我程序的运行过程是这样的:当用户移动鼠标的时候,检测鼠标所在处的控件是不是Treeview控件,如果是,则取得控件中已被选择的节点的句柄,然后取得节点的文本。
    1、现在我在自己的程序里面放置了一个Treeview,运行程序后,在自己的Treeview中点击Treeview(的任何位置),能够正确取得Treeview中已选择的节点的句柄和文本,但是当我把鼠标移出自己的窗口去点击别的程序中的Treeview时,能取的节点的句柄,但不能获得正确的字符串。(我的窗口总是在最上层,用了几个LABEL来显示获得的句柄、类名、窗口标题、字符串等信息)
    2、不论是在自己的Treeview还是在别的程序的Treeview里面,点击不同的节点时,会返回不同的句柄,但是pszText并不随着变,但是也不是固定不变,如果你不停的点来点去,它偶尔会随机变一下。
    3、我觉得这可能是一个重要的现象:当我的程序刚启动的时候,Treeview没有获得焦点,也没有任何节点被选择,这时候我把鼠标移动到Treeview上,返回的节点句柄是0,◆◆但是取得的字符串和我移动鼠标到别的程序的Treeview上取得的是一样的,比如“?8”这样的字符◆◆我只要点一下我的Treeview使其得到焦点(根节点自动被选择),然后即使重新使它失去焦点,还是能得到正确的结果,而别的程序上,我确认该Treeview拥有焦点并有节点被选择,返回的还是“?8”
      

  4.   

    大家帮帮忙啊。
    我的目的就是要取得别的程序上Treeview控件的节点上的字符串。
    最终目的是要把我们正在用的一个软件的Treeview节点上的文字自动填到该软件上面的一个Edit文本框中去,那个软件没有考虑到这一点,每次都要我动手去填,还要切换大小写,真是失败
      

  5.   

    刚才又仔细看了一下原程序:
    ===================================================
       hStr = GlobalAlloc(GMEM_FIXED, 1024)
         tv.mask = TVIF_TEXT '获取标题文本
        tv.HTreeItem = temp 'Item句柄
        tv.pszText = hStr
        tv.cchTextMax = 1023
        '发送TVM_GETITEM获得标题文本
        Call SendMessageRef(TVHwnd, TVM_GETITEM, 0, tv)
        '将标题文本拷贝到字符串astr中
        CopyMemory astr, hStr, 1024
        bstr = Left$(astr, (InStr(astr, Chr(0)) - 1))
        '释放分配的内存空间
            Label2.Caption = tv.pszText
            Label3.Caption = bstr
        GlobalFree hStr
    ====================================================
    tv.pszText是我自己的程序分配的内存地址,难道是说,我们饶了一大圈,却是SendMessageRef(TVHwnd, TVM_GETITEM, 0, tv)根本就没有取回正确的数据?
      

  6.   

    不能连续3次回复同一主题,又没有人理我,只好注册一个马甲进来,请谅解查了MSDN,SendMessageRef(lHwnd, TVM_GETITEM, 0, tv)可以返回一个Boolean值。改程序如下:
    ====================================================
        Dim aaa As Boolean
        aaa = SendMessageRef(TVHwnd, TVM_GETITEM, 0, tv)
        '将标题文本拷贝到字符串astr中
        If aaa Then
        Label5.Caption = "成功"
        Else
        Label5.Caption = "失败"
        End If
    ===================================================
    结果把鼠标移动到别的程序的Treeview的时候,返回全部是false,果然没能取回正确的结果。
    现在该怎么办呢?急,在线等!
      

  7.   

    看来这个问题已经到了屏幕取词的难度了,既然没有人帮我,我也放弃了,只有cuilonggang() 一个人进来说了话,微薄的100分请收下。