我正在自动化第三方应用程序。登录窗口如下所示
注意:表单中嵌入了背景图片,USERNAME
和PASSWORD
实际上都是图片的一部分。万一有人想知道为什么来自Window Detective
的以下类树视图没有,可能是»Label
控件。
获取组件句柄时没有任何问题。 我的意思是,我通常可以使用FindWindowEx
函数访问每个窗口/控件。
我可以为按钮实现GetWindowTextLength
和/或GetWindowText
函数,以区分我有哪个句柄。虽然这种方法适用于Button
s( .Caption ),但在使用Edit
控件时,不会让我受益。似乎Edit
控件没有任何唯一属性来区分哪一个是哪个。 (如果我错了,纠正我)......
假设我需要在编译阶段知道我将要处理哪个Edit
控件,所以我不会发送密码到用户名和其他方式。只有两个,但我说我不知道如何让正确一个。
我不介意在运行时搞清楚但是我不确定如何在不发送消息的情况下区分差异并且实际上在视觉上识别哪一个是哪个...
我不会真的称之为解决方案但是现在我只依赖于这样一个事实,即每次运行我的代码时,总是得到第二个句柄(密码< / em>)Edit
控制作为返回的第一个句柄。
我是否100%确定第Edit
个控件将始终在FindWindowEx
函数返回的层次结构中首先返回?
如果有人可以确认我的想法,那么我已经有了一个解决方案但是如果我不能总是期望第二个Edit
控件是然后我希望听到一些关于如何处理这种情况的见解。
注意:我认为我的问题实际上并不需要任何代码,但如果有人想查看代码,请发表评论,我会将其添加到问题中。
非常感谢你的时间。
答案 0 :(得分:4)
每个子HWND
都有一个名为ID
的属性。使用GetWindowLongPtr( hWnd, GWLP_ID )
获取它。根据目标应用程序的编码方式,ID
可能是区分子控件的一种方法。知道ID
您可以使用HWND
API获取子GetDlgItem
(当父级不是DialogBox时,工作正常,API应该被称为GetChildByID
)。
注意:某些目标应用程序确实使用随机/不可靠的ID值。
似乎有一个普遍的共识:枚举API依赖于Z-Order。例如,参见SO answer(可能会使您的问题变得某种'重复')
虽然某些应用程序可以“播放”其子窗口的Z顺序,但在标准情况下它们不会,这意味着第一个创建的子窗口位于Z顺序的顶部,而最后一个创建一个在底部。