遍历和查找外部程序 Tree-View 中的项目

2016-01-29 12:09 6 1 收藏

遍历和查找外部程序 Tree-View 中的项目,遍历和查找外部程序 Tree-View 中的项目

【 tulaoshi.com - C语言心得技巧 】

遍历和查找外部程序 Tree-View 中的项目

天津 赵春生

下载源代码

  《金山词霸2002》中的附录收集了很多古诗,有时为了寻找一篇古诗,得找很久很久(俺文科很差)。观察其附录的结构,发现是个Tree-View控件,如果能查找里面的项目该有多好,可这个功能软件本身却并没有提供(不知道现在最新的版本是否已经提供了这个功能,如果没有,赶快加上吧,顺便奖励俺一套该产品的最新版,哈哈)……问题出来了:我们要编写一个程序,让她在外部程序中的Tree-View控件里,按用户指定的项目名称顺序查找其中的项目。
  要查找首先得遍历,连范围都确定不好何谈查找?所以本篇分两部分进行讲解:第一部分解决遍历的问题;第二部分解决查找指定项目的问题。

第一部分:遍历外部程序Tree-View中的项目

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

一:程序说明:

如图一所示Tree-View控件的典型结构图,我们将按照图示的顺序来遍历其中的项目。


图一

翻阅SDK手册中关于Tree-View控件的相关章节,发现了几个有用的消息:

TVM_GETNEXTITEM:得到项目的句柄(参数:TVGN_ROOT得到根句柄,TVGN_NEXTVISIBLE得到下一个可见项目的句柄);TVM_EXPAND:展开或折叠指定项目(参数:TVE_EXPAND展开指定项目);TVM_SELECTITEM:选中指定项目。

利用这些消息和SendMessage()函数,我们可以很容易写出遍历代码。

二:具体实践

  在本文所提供的DEMO中,有一段将十六进制字符串转换成十进制无符号长整型的代码,作用是将用户输入的十六进制TV句柄值转换成十进制并存放在变量dec_sum中。此代码不列入本文讨论的范畴,大家不闲弱智的话就将就着用吧。下面是实现遍历功能的关键代码:

/*Tree-View Control_Demo_SeqShow 1.0 版*版权所有 (C) 2006 天津 赵春生*2006.08.28*http://timw.yeah.net*http://timw.126.com*本程序能顺序遍历TV控件中的所有项目。*代码在Win2000P+SP4 + VC6+SP6测试通过。*/if(error==0)//如果在数据验证转换的过程中未出现错误(error==0时无错误){//下面为核心部分:顺序显示(选中)指定Tree-View控件中的所有Item.hwnd=HWND(dec_sum);//得到转换后的数据//得到根句柄tvitem.hItem=(HTREEITEM)::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_ROOT, 0x0);::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)tvitem.hItem);//选中状态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);//选中状态::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)tvitem.hItem);continue;}//当不能再展开的时候,选择下一个可见项目tvitem.hItem=(HTREEITEM)::SendMessage(hwnd, TVM_GETNEXTITEM,TVGN_NEXTVISIBLE, (long)tvitem.hItem);//选中状态::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)tvitem.hItem);}}//释放内存CloseHandle(hwnd);//顺序显示(选中)完毕
三:TV_Demo_SeqShow的使用方法(图2):


图二

用SPY++的[Find Window]功能获得目标TV的句柄;将句柄值输入到TV_Demo_SeqShow中的[Tree-View Control''s Handle:];点击[GO!];

  如果你把[Windows 资源管理器]中的[文件夹]作为目标,那你可要作好心理准备了……如果实在忍受不了这种刺激,干脆把管理器关掉就可以了。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

第二部分:查找外部程序Tree-View中的项目

一:程序说明:

  我们已经成功得对外部程序Tree-View中的项目进行了遍历,如果能在遍历的过程中读取每一个项目的名称,结合我们给定的项目名进行比较,那么查找某个项目的问题将变得易如反掌。由此可见:关键的问题是如何读取项目的名称。
  读取项目的名称要发送TVM_GETITEM消息,由于该消息需要为LPARAM参数提供一个TV_ITEM结构的地址,在跨进程发送消息的前提下,为了使外部程序正常使用该内存地址,所以我们必须将TV_ITEM结构插入到目标进程的地址空间中去,代码如下:

ptvitem=(TVITEM*)VirtualAllocEx(hProcess,NULL,sizeof(TVITEM),MEM_COMMIT,PAGE_READWRITE);//分配内存WriteProcessMemory(hPr
                        

来源:http://www.tulaoshi.com/n/20160129/1484889.html

延伸阅读
上次介绍了如何在Delphi中使用发送消息的方式控制外部程序,一开始我在自己的项目中也确实是这么做的,但是后来遇到了这么一个问题: 我所调用的程序,会在执行一段处理过程中,将结果显示到一个ListView中,那么为了知道我发出的命令,到底被那个程序执行后结果如何,我就必须监视ListView中的内容,察看最后出现的结果文字是什么,...
标签: 电脑入门
办公软件Word是我们这些上班族每日必备的工具,平常只是用它来办公处理文档用。在办公之余我们可能会在办公室偷偷的上下QQ,或者躲着玩玩小游戏等。但这些程序不能明目张胆的放在桌面上,万一被领导抓住可不好看咯!这里给大家介绍一个将Word常用工具栏上的某个按钮替换成QQ启动按钮,或者某外部程序的启动按钮,点击一下即可马上打开你想要的程...
标签: vb
你再也不需要使用Win32应用编程接口或者VB的Shell函数来启动外部应用程序了。因为你可以使用.NET框架中的System.Diagnostics.Process类来进行这个操作,从而进一步简化代码。 虽然.NET使很多事情变得更加复杂,但是启动外部应用程序不在此列。在传统VB程序中,你可以使用Shell函数启动一个应用程序。当你传送一个数据文件名的时候,...
一、API函数的声明、自定义数据类型及常量的定义 ----注意:API函数的声明应在应用程序的代码模块中进行,且一条声明必须放在一行中'API函数的声明 PublicDeclareFunctionFindFirstFileLib "kernel32"Alias"FindFirstFileA" (ByVallpFileNameAsString, lpFindFileDataAsWIN32_FIND_DATA)AsLong PublicDeclareFuncti...
标签: 服务器
查找Linux系统中的大文件和大目录方法   查找大文件 eg:查找当前目录下大于10MB的文件 代码如下: $ find . -type f -size +10000k -exec ls -lh {} ; | awk ‘{ print $8 : $5 }’ Sample output: ./.kde/share/apps/akregator/Archive/http___blogs.msdn.com_MainFeed.aspx?Type=AllBlogs.mk4...

经验教程

774

收藏

66
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部