CTreeView,如何确定其他程序的SysTreeView32当前节点是否为子节点

xuri422 2010-02-05 09:37:45
{
tvitem.mask=TVIF_TEXT;
tvitem.cchTextMax=512;
tvitem.pszText=pItem;

tvitem.hItem=(HTREEITEM)::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_ROOT, 0x0);//得到根句柄

tvitem.cChildren = ::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_CHILD, (long)tvitem.hItem);//判断是否为叶子节点0x0

::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)tvitem.hItem);//选中状态

WriteProcessMemory(hProcess, ptvitem, &tvitem, sizeof(TVITEM), NULL);//将设置好的结构插入目标进程
::SendMessage(hwnd, TVM_GETITEM,0, (LPARAM)ptvitem);//发送TVM_GETITEM消息
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);//获取pszText
//MessageBox(ItemBuf,"ITEM TEXT");

//保存找到的记录写入到xml文件中
xml.AddElem("ALL");
xml.IntoElem();
if (tvitem.cChildren)
{
//xml.IntoElem();
xml.AddElem("ITEM", ItemBuf);
//xml.IntoElem();
++i;
}
else
{
xml.AddElem("ITEM", ItemBuf);
xml.OutOfElem();
--i;
}

while((long)tvitem.hItem)
{
while(::SendMessage(hwnd, TVM_EXPAND,TVE_EXPAND, (long)tvitem.hItem))//当此项目能展开时
{
tvitem.hItem=(HTREEITEM)::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_NEXTVISIBLE, (long)tvitem.hItem);//选择下一个可见项目

tvitem.cChildren = ::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_CHILD, (long)tvitem.hItem);//判断是否为叶子节点---该方法判断不了。有问题。
::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)tvitem.hItem);//选中状态
WriteProcessMemory(hProcess, ptvitem, &tvitem, sizeof(TVITEM), NULL);//将设置好的结构插入目标进程
::SendMessage(hwnd, TVM_GETITEM,0, (LPARAM)ptvitem);//发送TVM_GETITEM消息
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);//获取pszText

//保存找到的记录写入到xml文件中
if (tvitem.cChildren)
{
//xml.IntoElem();
xml.AddElem("ITEM", ItemBuf);
xml.IntoElem();
++i;
}
else
{
xml.AddElem("ITEM", ItemBuf);
while (--i)
{
xml.OutOfElem();
}
}

//MessageBox(ItemBuf,"ITEM TEXT");
if( strnicmp( ItemBuf,str_item_text,strlen(str_item_text) ) == 0)
{
MessageBox("已经找到!","恭喜");
Bingo=1;
tvitem.hItem=(HTREEITEM)0x0;//如果发现我们要找的目标,那么程序执行到这里就可以结束了。
break;
}
continue;
}

if(Bingo!=1)
{
tvitem.hItem=(HTREEITEM)::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_NEXTVISIBLE, (long)tvitem.hItem);//当不能再展开的时候,选择下一个可见项目
tvitem.cChildren = ::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_CHILD, (long)tvitem.hItem);//判断是否为叶子节点
::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)tvitem.hItem);//选中状态

WriteProcessMemory(hProcess, ptvitem, &tvitem, sizeof(TVITEM), NULL);//将设置好的结构插入目标进程
::SendMessage(hwnd, TVM_GETITEM,0, (LPARAM)ptvitem);//发送TVM_GETITEM消息
ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);//获取pszText

//保存找到的记录写入到xml文件中
if (tvitem.cChildren)
{
//xml.IntoElem();
xml.AddElem("ITEM", ItemBuf);
xml.IntoElem();
++i;
}
else
{
xml.AddElem("ITEM", ItemBuf);
while (--i)
{
xml.OutOfElem();
}
}

//MessageBox(ItemBuf,"ITEM TEXT");
if( strnicmp( ItemBuf,str_item_text,strlen(str_item_text) ) == 0)
{
MessageBox("已经找到!","恭喜");
Bingo=1;
tvitem.hItem=(HTREEITEM)0x0;//如果发现我们要找的目标,那么程序执行到这里就可以结束了。
break;
}
}

}
xml.Save(g_oFileName);
}
}
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuri422 2010-02-10
  • 打赏
  • 举报
回复
tvitem.cChildren = ::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_CHILD, (long)tvitem.hItem);//判断是否为叶子节点0x0
实际上,该语句是起作用的。用该语句的返回结果来判断即可。
cnzdgs 2010-02-06
  • 打赏
  • 举报
回复
写一个递归函数,给函数传一个节点句柄,函数负责遍历该节点下面的子树。函数中先展开节点,如果失败则返回,如果成功则循环逐一取子节点递归。
sjdev 2010-02-05
  • 打赏
  • 举报
回复
查找看有无父节点。
xuri422 2010-02-05
  • 打赏
  • 举报
回复
我自己写的对话框程序,想要保存windows资源管理器左侧的内容(即所有目录保存到一个xml文件内);现在的问题是我如何判断取到的当前节点是不是叶子节点呢?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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