高分求解:怎样得到正在执行的程序中ListView中的内容---急急急急急(200分)

  • 主题发起人 主题发起人 illcat
  • 开始时间 开始时间
I

illcat

Unregistered / Unconfirmed
GUEST, unregistred user!
已经得到了该程序的ListView的句柄(Class名为SysListView32),请问怎样得到ListView中<br>的内容,分不够可以再加,我有的是分!
 
抓ListView的图不知道满不满足你的要求?
 
哎,能不能帮我先解决这个问题呢
 
我刚才用SPY++看看了,没有找到门道
 
在VC下,一般是得到指向这个窗口类的指针,然后用指针强制转化就可以对这个窗口类<br>进行控制,如:((ClistCtrl*)pWnd)-&gt;DeleteAllItems();,在VC下试验成功。<br>可是在Delphi下,我也想强制转化(TListView(LstHWND)).Clear;结果出错,faint!<br>大侠们,给俺点指点把!
 
可能是类型不匹配吧!
 
把hwnd强制转换成TListView根本不行的,他们是完全不同的东西。<br>一定要这样做的话,只好用消息:<br>SendMessage(lsthwnd,LVM_DELETEALLITEMS, 0,0);<br>不过对于进程外的ListView,也只有少量的消息可以使用,因为跨进程的结构传递是<br>不允许的。
 
postmessage(handle,LVM_DELETEITEM,idx,0); idx为指定项目的index
 
我只是举个例子要删除List中所有的项,大家注意我的问题,我是想得到List中所有的内容!
 
Delphi真的不可以解决这个问题吗?<br>为什么得到了HWND就只能够向其发送消息来控制它,就没有其它的办法吗?像<br>VC一样!!!!!faint!
 
vc其实也是通过消息来操作的。没有其他办法。
 
To:月满西楼<br>如果是VC写的话,得到指向对象的指针,就可以用它的方法和函数了,可是Delphi怎么做呢
 
VC中CWnd提供了一个方法FromHandle可以把窗口的句柄转化为指向窗口的指针,不知道<br>Delphi中有没有,查了半天也没找到!
 
给你看VC的源代码就该明白了:<br>_AFXCMN_INLINE BOOL CListCtrl::DeleteAllItems()<br>{ ASSERT(::IsWindow(m_hWnd)); <br>return (BOOL) ::SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L); }<br>对ListView的一切操作其实都是通过消息来完成的,VC只不过加了一层封装而已。<br>因为VCL封装窗口过程的方法和MFC截然不同,所以在Delphi里面没有简单的办法可以<br>直接把HWND映射到TListView。所以我说消息是绕不开的,不论是什么样的办法,最终<br>还是要回到消息中来。
 
To:月满西楼<br>收到!这个道理其实我也明白,如果真的Delphi没有提供的话,那可真不爽!
 
其实哪个工具都有不爽的时候~~解决问题第一
 
要得到别的进程中的ListView中的内容是比较困难的,直接使用消息也是不行的,因为不<br>允许跨越进程边界,直接使用消息只会得到一个地址错误。<br>你真的想得到别的进程中的ListView中的内容的话有两种情况两种方法:<br>一、ListView的内容就在ListView中。这是最常见的情况也是最好办的情况。只要用Hook<br>就可以了,通常可以拦截LVM_INSERTITEM或是LVM_SETITEMTEXT等消息。<br>二、ListView的内容不在ListView中。也就是使用了所谓Virtual技术,那没有办法了,最<br>笨的一个办法上,使用屏幕截词技术,在他重画时得到显示的内容,不显示部分就没办法<br>了。<br>
 
用什么Hook呢?用WH_GETMESSAGE,我只能得到ListView的WM_PAINT消息(也许是我的方法<br>又问题),没有办法得到LVM_SETITEMTEXT消息啊,请DoubleWood大侠继续指点
 
用Spy++就可看到ListView的所有的消息,包括LVM_SETITEMTEXT等,不知道MS是怎么做的?
 
后退
顶部