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