我能始终确定通过FindWindowExfind的控件的层级顺序吗?

我在做什么?

我正在自动化第三方应用程序。 login窗口看起来像这样

在这里输入图像说明

注意:表单中embedded了背景图像, USERNAMEPASSWORD实际上是图像的一部分。 以防万一有人想知道为什么Window Detective下面的类树视图没有,可能» Label控件。

在这里输入图像说明

我在哪里?

我没有任何问题得到处理的组件。 我的意思是,我通常可以使用FindWindowEx函数访问每个窗口/控件

我可以实现一个GetWindowTextLength和/或GetWindowText函数button来区分哪一个我有句柄。 虽然这种方法适用于Buttons.Caption ),但在使用Edit控件时不会使我受益。 看来, Edit控件没有任何独特的属性来区分哪一个是哪个。 ( 纠正我,如果我错了 )…

问题

假设我需要在编译阶段知道哪个Edit控件是要处理的, 所以我不会向用户名发送密码 。 只有两个,但就像我说过的我不知道如何得到正确的

我不介意在运行时搞清楚,但我不确定如何区分差异而不发送消息,并实际上在视觉上确定哪一个是哪个…

当前解决scheme

我不会真的叫这个解决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顺序的顶部,而最后创建的子窗口是在底部。