我是否可以始终确定通过FindWindowEx找到的控件的层次顺序?

时间:2014-02-14 09:39:34

标签: c# vb.net windows vba winapi

我在做什么?

我正在自动化第三方应用程序。登录窗口如下所示

enter image description here

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

enter image description here

我在哪里?

获取组件句柄时没有任何问题。 我的意思是,我通常可以使用FindWindowEx函数访问每个窗口/控件。

我可以为按钮实现GetWindowTextLength和/或GetWindowText函数,以区分我有哪个句柄。虽然这种方法适用于Button s( .Caption ),但在使用Edit控件时,不会让我受益。似乎Edit控件没有任何唯一属性来区分哪一个是哪个。 (如果我错了,纠正我)......

问题

假设我需要在编译阶段知道我将要处理哪个Edit控件,所以我不会发送密码到用户名和其他方式。只有两个,但我说我不知道​​如何让正确一个。

我不介意在运行时搞清楚但是我不确定如何在不发送消息的情况下区分差异并且实际上在视觉上识别哪一个是哪个...

当前解决方案

我不会真的称之为解决方案但是现在我只依赖于这样一个事实,即每次运行我的代码时,总是得到第二个句柄(密码< / em>)Edit控制作为返回的第一个句柄。

问题

我是否100%确定第Edit个控件将始终在FindWindowEx函数返回的层次结构中首先返回?

如果有人可以确认我的想法,那么我已经有了一个解决方案但是如果我不能总是期望第二个Edit控件是然后我希望听到一些关于如何处理这种情况的见解。

注意:我认为我的问题实际上并不需要任何代码,但如果有人想查看代码,请发表评论,我会将其添加到问题中。

非常感谢你的时间。

1 个答案:

答案 0 :(得分:4)

每个子HWND都有一个名为ID的属性。使用GetWindowLongPtr( hWnd, GWLP_ID )获取它。根据目标应用程序的编码方式,ID可能是区分子控件的一种方法。知道ID您可以使用HWND API获取子GetDlgItem(当父级不是DialogBox时,工作正常,API应该被称为GetChildByID)。

注意:某些目标应用程序确实使用随机/不可靠的ID值。

似乎有一个普遍的共识:枚举API依赖于Z-Order。例如,参见SO answer(可能会使您的问题变得某种'重复')

虽然某些应用程序可以“播放”其子窗口的Z顺序,但在标准情况下它们不会,这意味着第一个创建的子窗口位于Z顺序的顶部,而最后一个创建一个在底部。