看过“Hook其他程序中的StringGrid的内容 ”的大虾救助 ( 积分: 100 )

  • 主题发起人 主题发起人 yhtang
  • 开始时间 开始时间
Y

yhtang

Unregistered / Unconfirmed
GUEST, unregistred user!
原贴:<br>http://www.delphibbs.com/keylife/iblog_show.asp?xid=15600<br>我已改造了一下原来的代码<br>是去取另一个程序的TPanel上的Label的值<br>如果另一个程序是delphi的,那没问题<br>如果另一个程序是用c++ builder写的<br>好像调用FindControl时得到nil<br>请高手指点
 
原贴:<br>http://www.delphibbs.com/keylife/iblog_show.asp?xid=15600<br>我已改造了一下原来的代码<br>是去取另一个程序的TPanel上的Label的值<br>如果另一个程序是delphi的,那没问题<br>如果另一个程序是用c++ builder写的<br>好像调用FindControl时得到nil<br>请高手指点
 
function FindControl(Handle: HWnd): TWinControl;<br>var<br> &nbsp;OwningProcess: DWORD;<br>begin<br> &nbsp;Result := nil;<br> &nbsp;if (Handle &lt;&gt; 0) and (GetWindowThreadProcessID(Handle, OwningProcess) &lt;&gt; 0) and<br> &nbsp; &nbsp; (OwningProcess = GetCurrentProcessId) then<br> &nbsp;begin<br> &nbsp; &nbsp;if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then<br> &nbsp; &nbsp; &nbsp;Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; &nbsp;Result := Pointer(SendMessage(Handle, RM_GetObjectInstance, 0, 0));<br> &nbsp;end;<br>end;<br>据说GetProp对delphi的编译版本有要求?
 
从别人exe上去取返回的都是nil<br>如果是我自己写的测试程序倒没问题
 
刚看到,是什么问题?我的测试程序没有问题呀。把源代码发过来我看看 lcb@iii-grp.com
 
邮件已发你邮箱<br>现在的问题是已知目标窗口的句柄<br>如何在隐形窗口中根据窗口句柄得到这个窗口上的某个Label值<br>在你的原帖的评论里有说明<br>谢谢
 
你的程序源代码跟我的差别已经很大啦,关键的地方被你改错了,哪里还能HOOK得到?没看懂源代码的话,不要乱改一气,而应该做局部微调。<br>1.隐形窗口创建的地方不对,那不是在目标进程内创建的。<br>2.InitControls过程初始化ControlAtom和RM_GetObjectInstance,没看到你在哪里调用的。<br>3.DestWnd, HostWnd没看到你在哪里对它们进行赋值啦,不设定它们的值,Hook的对象和要通知的对象哪里知道? <br><br>至于怎么Hook Label,看看http://www.delphibbs.com/keylife/iblog_show.asp?xid=12219 的 2005-1-11 14:09:24 之补充说明内容。<br><br>下次发邮件换个邮箱<br>A message that you sent could not be delivered to all of its recipients.<br>The following address(es) failed:<br><br> &nbsp;tyuhang@sina.com<br> &nbsp; &nbsp;SMTP error from remote mailer after RCPT TO:&lt;tyuhang@sina.com&gt;:<br> &nbsp; &nbsp;host sinamx.sina.com.cn [202.108.3.187]: 554 Please visite http://antispam.sina.com.cn/denyip.php?IP=202.228.192.194 (#5.7.1)
 
好的<br>我再按照你的代码试试看<br>主要是你是一开始就当那个包含Label的窗口打开在那里了<br>我是在运行过程中这个窗口是不停的打开的<br>只有打开时才去获取Label值<br>InitControls被我不小心搞掉了,哈哈<br>谢谢
 
我用上面介绍的方法做了个例子,可以读取,但对于从数据库中读取数据的stringgrid如果要获得其CELL中的值就不成功,获得的row/cell值总是0/21,这是为什么啊!?急
 
“从数据库中读取数据的stringgrid”,你确定是TStringGrid组件,而不是第三方数据敏感Grid组件(未必从TStringGrid继承,即使从TStringGrid继承,Cell内容大概也是直接从DataSource.DataSet中取来显示的,又未必存放在Cols,Rows,Cells中)?
 
lichengbin,我用了两个程序做测试,<br>第一个由于不是我自己编的程序,没有源码,他用的是TAdvStringGrid控件,他是从数据库里读取数据的,如果象你说的那样:Cell内容是直接从DataSource.DataSet中取来显示的,未必存放在Cols,Rows,Cells中,那我怎样才能取得里面的数据啊!?<br>第二个程序我装了TAdvStringGrid控件,自己将例程里的TStringGrid改成了TAdvStringGrid,我可以获得TAdvStringGrid里cells的数据,说明TAdvStringGrid,从TStringGrid继承的。
 
对于从数据库里读取数据的,应该从DataSource.DataSet获取数据,如TDBGrid;<br>“对于从数据库中读取数据的stringgrid如果要获得其CELL中的值就不成功,获得的row/cell值总是0/21”<br>“第二个程序我装了TAdvStringGrid控件,自己将例程里的TStringGrid改成了TAdvStringGrid,我可以获得TAdvStringGrid里cells的数据”<br>你到底是什么意思呢?自相矛盾嘛,一会儿说可以获取,一会儿说不能获取的[?]
 
哦,是这样的:<br>我用两个程序做的实验<br>第一个不是我编的,我用SPY++知道他用的是TAdvStringGrid控件,而且他是从数据库中读取数据的,我最想知道能否从这个TAdvStringGrid中读取数据。<br>第二个程序是我自己编的,是从你的例子中将TStringGrid改成了TAdvStringGrid,是用来验证TAdvStringGrid这个控件是否继承于TStringGrid,这个实验已经成功了。<br>我最想知道如果TStringGrid是从数据中读取数据的,该怎么获得其CELL中的数据!?
 
不是说了么,通过关联的数据集DataSource.DataSet来呀
 
可是程序不是我编的,没有源码,我不知道他是和哪个数据集DataSource.DataSet关联的啊,能给个例子吗!?谢谢了
 
后退
顶部