I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #1 已经得到了该程序的ListView的句柄(Class名为SysListView32),请问怎样得到ListView中<br>的内容,分不够可以再加,我有的是分!
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #5 在VC下,一般是得到指向这个窗口类的指针,然后用指针强制转化就可以对这个窗口类<br>进行控制,如:((ClistCtrl*)pWnd)->DeleteAllItems();,在VC下试验成功。<br>可是在Delphi下,我也想强制转化(TListView(LstHWND)).Clear;结果出错,faint!<br>大侠们,给俺点指点把!
在VC下,一般是得到指向这个窗口类的指针,然后用指针强制转化就可以对这个窗口类<br>进行控制,如:((ClistCtrl*)pWnd)->DeleteAllItems();,在VC下试验成功。<br>可是在Delphi下,我也想强制转化(TListView(LstHWND)).Clear;结果出错,faint!<br>大侠们,给俺点指点把!
月 月满西楼 Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #7 把hwnd强制转换成TListView根本不行的,他们是完全不同的东西。<br>一定要这样做的话,只好用消息:<br>SendMessage(lsthwnd,LVM_DELETEALLITEMS, 0,0);<br>不过对于进程外的ListView,也只有少量的消息可以使用,因为跨进程的结构传递是<br>不允许的。
把hwnd强制转换成TListView根本不行的,他们是完全不同的东西。<br>一定要这样做的话,只好用消息:<br>SendMessage(lsthwnd,LVM_DELETEALLITEMS, 0,0);<br>不过对于进程外的ListView,也只有少量的消息可以使用,因为跨进程的结构传递是<br>不允许的。
K kiely Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #8 postmessage(handle,LVM_DELETEITEM,idx,0); idx为指定项目的index
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #9 我只是举个例子要删除List中所有的项,大家注意我的问题,我是想得到List中所有的内容!
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #10 Delphi真的不可以解决这个问题吗?<br>为什么得到了HWND就只能够向其发送消息来控制它,就没有其它的办法吗?像<br>VC一样!!!!!faint!
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #13 To:月满西楼<br>如果是VC写的话,得到指向对象的指针,就可以用它的方法和函数了,可是Delphi怎么做呢
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #14 VC中CWnd提供了一个方法FromHandle可以把窗口的句柄转化为指向窗口的指针,不知道<br>Delphi中有没有,查了半天也没找到!
月 月满西楼 Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #15 给你看VC的源代码就该明白了:<br>_AFXCMN_INLINE BOOL CListCtrl:eleteAllItems()<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>还是要回到消息中来。
给你看VC的源代码就该明白了:<br>_AFXCMN_INLINE BOOL CListCtrl:eleteAllItems()<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>还是要回到消息中来。
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #16 To:月满西楼<br>收到!这个道理其实我也明白,如果真的Delphi没有提供的话,那可真不爽!
D DoubleWood Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-25 #18 要得到别的进程中的ListView中的内容是比较困难的,直接使用消息也是不行的,因为不<br>允许跨越进程边界,直接使用消息只会得到一个地址错误。<br>你真的想得到别的进程中的ListView中的内容的话有两种情况两种方法:<br>一、ListView的内容就在ListView中。这是最常见的情况也是最好办的情况。只要用Hook<br>就可以了,通常可以拦截LVM_INSERTITEM或是LVM_SETITEMTEXT等消息。<br>二、ListView的内容不在ListView中。也就是使用了所谓Virtual技术,那没有办法了,最<br>笨的一个办法上,使用屏幕截词技术,在他重画时得到显示的内容,不显示部分就没办法<br>了。<br>
要得到别的进程中的ListView中的内容是比较困难的,直接使用消息也是不行的,因为不<br>允许跨越进程边界,直接使用消息只会得到一个地址错误。<br>你真的想得到别的进程中的ListView中的内容的话有两种情况两种方法:<br>一、ListView的内容就在ListView中。这是最常见的情况也是最好办的情况。只要用Hook<br>就可以了,通常可以拦截LVM_INSERTITEM或是LVM_SETITEMTEXT等消息。<br>二、ListView的内容不在ListView中。也就是使用了所谓Virtual技术,那没有办法了,最<br>笨的一个办法上,使用屏幕截词技术,在他重画时得到显示的内容,不显示部分就没办法<br>了。<br>
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-26 #19 用什么Hook呢?用WH_GETMESSAGE,我只能得到ListView的WM_PAINT消息(也许是我的方法<br>又问题),没有办法得到LVM_SETITEMTEXT消息啊,请DoubleWood大侠继续指点
用什么Hook呢?用WH_GETMESSAGE,我只能得到ListView的WM_PAINT消息(也许是我的方法<br>又问题),没有办法得到LVM_SETITEMTEXT消息啊,请DoubleWood大侠继续指点
I illcat Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-26 #20 用Spy++就可看到ListView的所有的消息,包括LVM_SETITEMTEXT等,不知道MS是怎么做的?