如果窗体上有3个相同的控件,如何获得我其中一个我想要的句柄呢(100分)

  • 主题发起人 longwenyong1957
  • 开始时间
L

longwenyong1957

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体上有3个相同的控件,如何获得其中一个我想要的句柄呢?急,在线等!
 
晕死。这个窗体是本身的程序还是外部程序哦?
本身的程序控件都有名字啊。
比如edit1 edit2 edit3
 
是访问外部的程序啊。没有CAPTION属性的。有CAPTION属性就好办了
 
你没有判断的依据就很难弄,比如你要的控件中会出现一些特殊的内容,那也可以想想办法,你能确定是什么控件吗?
 
可以确定是什么控件,但是上面有两个一样的控件,这样我只是可以访问到其中一个的句柄,另外一个的句柄访问不到啊,干着急啊
 
试试下面的方法(注意是写在定时器里的。看看鼠标指向那个控件时能否得到什么):
procedure TForm1.Timer1Timer(Sender: TObject);
var
Pos: TPoint;
Handle: HWND;
Buf: array[0..1024] of Char;
Ctr: TWinControl;
begin
GetCursorPos(Pos);
//得到当前光标位置
Handle := WindowFromPoint(Pos);
//返回当前位置的句柄
HandleText.Text := IntToStr(Handle);
GetClassName(Handle, Buf, 1024);
//得到类名
Ctr := FindControl(Handle);
if Ctr <> nil then
edtParClassName.Text := Ctr.ClassParent.ClassName;
ClassNameText.Text := Buf;
SendMessage(Handle, WM_GETTEXT, 33, Integer(@Buf));
//得到标题
TitleText.Caption := Buf;
//得到内容
end;
 
我用SPY++看过了,除了可以获得CLASS属性,别的CAPTION和TEXT都看不到.不过我会按你的方法试下看!分数给你记下了!谢谢楼上的回答!
 
这些控件都是在一个父窗体上不。
首先得到这些控件的父窗体句柄 parentHandle
然后用SPK++看这些控件的 Contol ID
找到你需要的那个控件的Contol ID
比如 Contol ID 为 000003E8
Childhandle := GetDlgItem(parentHandle, $3e8);
这样就能得到你要的控件句柄了。
 
楼上的方法不一定完全可行,楼主已经用SPY++看过了,得到那样的结果我估计是那个程序对某些控件做过一些保护(也可能是控件自身就有的保护),如果是那样的话就比较难了,看你的运气如何了[:)]
 
我不这么认为!
 
比如QQ里面的窗口。3个按钮 ClassName 都是Button ,Caption 都是空。无法定位到具体的那个按钮上。虽然这个3个按钮的这些属性都一样。但他们的Contol ID是不同的。通过Contol ID来定位具体的某个按钮。然后用 GetDlgItem(parentHandle, $3e8) 得到这个按钮的句柄!如此比你那个鼠标定位要更好!
 
呵呵,楼上误解我的意思了,楼主如果想得到控件的内容,有时候是很难的,就用QQ来说(最新版的),你可以试试得到它的密码框的内容,看能否轻易的得到。另外,某些程序完全可以用挂全局钩子的方法来进行某些“危险”的API的拦截,比如针对SendMessage的相关消息,当然可以拦截GetDlgItem,这样的话就比较难了。
 
三个EDIT,输入不同内容,然后就用得到句柄了。
 
control id 在每次启动的后都不一样的,它不是不变的,是操作系统根据当前的情况给分配的,所以使用control id的方法是不行的。刚开始的时候里面是什么内容也没有的,要输入不同内容也需要获得相应的句柄才可以,所以这个方法也是行不通的
 
帮你顶一下。
 
论坛里的高手呢??怎么这个问题没人能够帮解决吗?我所有的分都给出了哦!
 
顶部