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