findwindowex查找多级子控件句柄的问题。

zerostudy 2009-07-21 05:24:54
请问这个如何查找。
还有比如一个软件的界面里。
有四个类名为edit的。标题不同。
这个能否直接查找到想要的那个edit类名的控件句柄??
是否只能循环????

主窗口
子窗口1 如类名为 button 标题不同
子窗口2 button 标题不同
子窗口3 combox
子窗口4-------子窗口1 edit 标题不同
-------子窗口2 edit 标题不同
-------子窗口3 edit 标题不同
-------子窗口4 button 标题不同
-------子窗口5 button 标题不同

这个如何查找edit为类名的句柄?

...全文
1558 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaoheyi 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ccrun 的回复:]
Delphi(Pascal) codevar
hTopWnd, hEditWnd: THandle;begin
hTopWnd := FindWindow('顶层窗口类名','顶层窗口标题');if IsWindow(hTopWnd)thenbegin
hEditWnd := FindWindowEx(hTopWnd, NULL,'子窗口类名','子窗口标题');i¡­
[/Quote]
我正好能用得到啊..谢了..
shaoyiping 2009-07-24
  • 打赏
  • 举报
回复
认真看看findwindowex的每一个参数,,,你就会得到正确答案
zerostudy 2009-07-22
  • 打赏
  • 举报
回复
e1:=findwindowex(h,e,'edit',nil); //这样也不行。e是h子窗口,edit是在e里面的
应是这样设置么?
zerostudy 2009-07-22
  • 打赏
  • 举报
回复
楼上的可以。不过在二级子句柄不行啊???二级句柄里怎么找???


这个远程桌面的是这样的

spy++找到的如一楼。。



h,h1,h2,h3,h4,e,e1,e2:hwnd;

begin
winexec('mstsc',1);
sleep(2000);

h:=findwindow(nil,'远程桌面连接');

h1:=findwindowex(h,0,'button',nil);
h2:=GetWindow(h1,GW_HWNDNEXT);
h3:=GetWindow(h2,GW_HWNDNEXT);
h4:=GetWindow(h3,GW_HWNDNEXT);
sendmessage(h4,WM_LBUTTONDOWN,0,0); //按下鼠标
sendmessage(h4,WM_LBUTTONUP,0,0); //释放鼠标
// sendmessage(h1,WM_SETTEXT,0,Integer(PChar('admin')));

e:=findwindowex(h,0,'systabcontrol32',nil);
e1:=findwindowex(e,0,'edit',nil);
e2:=getwindow(e1,gw_hwndnext);
showmessage(inttostr(e1)); //e1=0
sendmessage(e1,WM_SETTEXT,0,Integer(PChar('admin')));//这里找不到
sendmessage(h,WM_SETTEXT,0,Integer(PChar('admin')));


///

xinxinshou2009 2009-07-22
  • 打赏
  • 举报
回复
一般程序正常状态下,edit基本都是空的,所以用标题查找可能不通用。思路简单操作也简单的方法就是遍历了,用h1:=FindWindowEx(handle,0,'Tedit',nil);来查找,其中handle是父窗体的句柄,h1是edit的句柄,这样查找到的是第一个edit,要找第二个就h2:=GetWindow(h1,GW_HWNDNEXT);你要找第四个的话,就要用三次这个语句,看似有些麻烦,可实质上电脑执行起来很快的,几乎不费时间

只要那个外部程序不关闭,这个句柄是一直有效的。所以如果你在程序中要多次引用这个句柄,不需要每次都这样查找,只要把这个句柄设置为全局变量就可以了,可以随时引用。
ccrun.com 2009-07-21
  • 打赏
  • 举报
回复
var
hTopWnd, hEditWnd: THandle;
begin
hTopWnd := FindWindow('顶层窗口类名', '顶层窗口标题');
if IsWindow(hTopWnd) then
begin
hEditWnd := FindWindowEx(hTopWnd, NULL, '子窗口类名', '子窗口标题');
if IsWindow(hEditWnd) then
begin
// 找到Edit子窗口了...
end;
end;
end;
Corn1 2009-07-21
  • 打赏
  • 举报
回复
循环用findwindowex
参数里面有一个起始handle,用上一次find到的handle作为下一次的起始handle,就可以遍历了
sanguomi 2009-07-21
  • 打赏
  • 举报
回复
先编历窗口,再遍历窗口里的控件,取出标题判断

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧