我正在自动化第三方应用程序。 login窗口看起来像这样
注意:表单中embedded了背景图像, USERNAME
和PASSWORD
实际上是图像的一部分。 以防万一有人想知道为什么Window Detective
下面的类树视图没有,可能» Label
控件。
我没有任何问题得到处理的组件。 我的意思是,我通常可以使用FindWindowEx
函数访问每个窗口/控件 。
我可以实现一个GetWindowTextLength
和/或GetWindowText
函数button来区分哪一个我有句柄。 虽然这种方法适用于Buttons ( .Caption ),但在使用Edit
控件时不会使我受益。 看来, Edit
控件没有任何独特的属性来区分哪一个是哪个。 ( 纠正我,如果我错了 )…
假设我需要在编译阶段知道哪个Edit
控件是要处理的, 所以我不会向用户名发送密码 。 只有两个,但就像我说过的我不知道如何得到正确的 。
我不介意在运行时搞清楚,但我不确定如何区分差异而不发送消息,并实际上在视觉上确定哪一个是哪个…
我不会真的叫这个解决scheme,但现在我只依赖于这样一个事实,每次我运行我的代码,我总是得到第二个( 密码 ) Edit
控制的句柄作为返回的第一个句柄。
我可以100%肯定第二个Edit
控件总是返回FindWindowEx
函数返回的层次结构中的第一个?
如果有人可以证实我的想法比我已经有一个解决scheme, 但如果我不能总是期望第二个Edit
控制返回,那么我想听听一些如何处理这种情况的见解。
注:我不认为任何代码实际上是我的问题需要,但如果有人想看到代码,那么请留下评论,我会将其添加到问题。
非常感谢您的时间。
每个孩子HWND
都有一个叫ID
的属性。 使用GetWindowLongPtr( hWnd, GWLP_ID )
来获取它。 根据目标应用程序的编码方式,该ID
可能是区分子控件的一种方法。 知道这个ID
你可以通过GetDlgItem
API获得子HWND
(当父子不是DialogBox时,API应该被称为GetChildByID
)。
注意:一些目标应用程序真的使用随机/不可靠的ID值。
似乎有一个普遍的共识:枚举API依赖于Z顺序。 看到例如,所以答案 (也许让你的问题某种'重复')
虽然有些应用程序可能会与其子窗口的Z顺序“玩”,但在标准情况下它们不会,这意味着第一个创建的子窗口位于Z顺序的顶部,而最后创建的子窗口是在底部。