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为类名的句柄?

...全文
1404 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
  • 打赏
  • 举报
回复
先编历窗口,再遍历窗口里的控件,取出标题判断
Spy++ Lite 2.4 Build 20080512 Spy++ Lite是一款强有力的编程辅助工具,对分析窗体结构有独到之处。可以以十六进制和十进制两种不同方式显示窗口句等所有数值。本软件还可以简单调节窗口的状态和形为,如是否可见,是否可用,最大化,激活等。除此以外,您还可以把它当作一个截图的小工具来用。:) 下面举两个例来小试牛刀: 1、激活灰色按钮: 打开任一文件的属性窗口,它的右下角处“应用”按钮都是不可用的(灰色的)。拖动本软件的探测器指针选中该按钮。切换至“消息”标签页,勾选“窗口可用”。看到了吧?“应用”按钮被我们激活了。 2、监视IE上网记录: 用本软件的探测器指针选中IE的地址栏。看到它的窗口类名为Edit;切换至“窗口”标签页,点击“父窗口”标签,使父窗口成为当前窗口;切换到“类”标签页,看到其类名为ComboBox;再依照上步点击,将得到父窗口类名依次是ComboBoxEx32、ReBarWindow32、WorkerW,直到最外层的IEFrame。此时再点击“窗口列表”按钮,依次双击窗口,看看能否找到地址栏Edit。窗体结构清楚了,我们就不难用FindWindowEx、SendMessage、GetClassName、GetWindowText等几个API函数来监视上网记录了。 升级日志: 2.2-2.4 增加功能: 1、更换内部件,引用主题风格; 2、修正细节问题; 3、提供不同编程语言的开源版本。 2.1-2.2 增加功能: 1、去除对对话框件的依赖; 2、修正进程ID的显示BUG。 2.0-2.1 增加功能: 1、可以直接选中不可用的窗口; 2、窗口列表; 3、进入多级窗口并可导出。 1.1-2.0 增加功能: 1、显示窗口ID、进程ID、程序文件路径; 2、窗口样式、扩展样式、类样式并列表给出; 3、消息功能,改变窗口的最大化、最小化、是否可见、是否可用等状态; 4、窗口截图。
Spy++ Lite是一款强有力的编程辅助工具,对分析窗体结构有独到之处。可以以十六进制和十进制两种不同方式显示窗口句等所有数值。本软件还可以简单调节窗口的状态和形为,如是否可见,是否可用,最大化,激活等。除此以外,您还可以把它当作一个截图的小工具来用。:) 下面举两个例来小试牛刀: 1、激活灰色按钮: 打开任一文件的属性窗口,它的右下角处“应用”按钮都是不可用的(灰色的)。拖动本软件的探测器指针选中该按钮。切换至“消息”标签页,勾选“窗口可用”。看到了吧?“应用”按钮被我们激活了。 2、监视IE上网记录: 用本软件的探测器指针选中IE的地址栏。看到它的窗口类名为Edit;切换至“窗口”标签页,点击“父窗口”标签,使父窗口成为当前窗口;切换到“类”标签页,看到其类名为ComboBox;再依照上步点击,将得到父窗口类名依次是ComboBoxEx32、ReBarWindow32、WorkerW,直到最外层的IEFrame。此时再点击“窗口列表”按钮,依次双击窗口,看看能否找到地址栏Edit。窗体结构清楚了,我们就不难用FindWindowEx、SendMessage、GetClassName、GetWindowText等几个API函数来监视上网记录了。 升级日志: 2.2-2.4 增加功能: 1、更换内部件,引用主题风格; 2、修正细节问题; 3、提供不同编程语言的开源版本。 2.1-2.2 增加功能: 1、去除对对话框件的依赖; 2、修正进程ID的显示BUG。 2.0-2.1 增加功能: 1、可以直接选中不可用的窗口; 2、窗口列表; 3、进入多级窗口并可导出。 1.1-2.0 增加功能: 1、显示窗口ID、进程ID、程序文件路径; 2、窗口样式、扩展样式、类样式并列表给出; 3、消息功能,改变窗口的最大化、最小化、是否可见、是否可用等状态; 4、窗口截图。
Spy++ Lite是一款强有力的编程辅助工具,对分析窗体结构有独到之处。可以以十六进制和十进制两种不同方式显示窗口句等所有数值。本软件还可以简单调节窗口的状态和形为,如是否可见,是否可用,最大化,激活等。除此以外,您还可以把它当作一个截图的小工具来用。:) 下面举两个例来小试牛刀: 1、激活灰色按钮: 打开任一文件的属性窗口,它的右下角处“应用”按钮都是不可用的(灰色的)。拖动本软件的探测器指针选中该按钮。切换至“消息”标签页,勾选“窗口可用”。看到了吧?“应用”按钮被我们激活了。 2、监视IE上网记录: 用本软件的探测器指针选中IE的地址栏。看到它的窗口类名为Edit;切换至“窗口”标签页,点击“父窗口”标签,使父窗口成为当前窗口;切换到“类”标签页,看到其类名为ComboBox;再依照上步点击,将得到父窗口类名依次是ComboBoxEx32、ReBarWindow32、WorkerW,直到最外层的IEFrame。此时再点击“窗口列表”按钮,依次双击窗口,看看能否找到地址栏Edit。窗体结构清楚了,我们就不难用FindWindowEx、SendMessage、GetClassName、GetWindowText等几个API函数来监视上网记录了。 升级日志: 2.2-2.4 增加功能: 1、更换内部件,引用主题风格; 2、修正细节问题; 3、提供不同编程语言的开源版本。 2.1-2.2 增加功能: 1、去除对对话框件的依赖; 2、修正进程ID的显示BUG。 2.0-2.1 增加功能: 1、可以直接选中不可用的窗口; 2、窗口列表; 3、进入多级窗口并可导出。 1.1-2.0 增加功能: 1、显示窗口ID、进程ID、程序文件路径; 2、窗口样式、扩展样式、类样式并列表给出; 3、消息功能,改变窗口的最大化、最小化、是否可见、是否可用等状态; 4、窗口截图。

1,183

社区成员

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

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