c# - 我能否始终确定通过 FindWindowEx 找到的控件的层次顺序?

标签 c# vb.net windows vba winapi

我在做什么?

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

enter image description here

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

enter image description here

我现在在哪里?

我在获取组件句柄方面没有任何问题。 我的意思是,我通常可以使用 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/

相关文章:

c# - 迭代 XML 时 Linq 重复元素

c# - 定义匹配字符串时要忽略的字符 C#

vb.net - Visual Studio 2013 - F10/F11 在升级时停止工作?

html - VB.Net:如何上传 <input type ="file"... > 中的文件

asp.net - .Net 核心应用程序无法通过 FTP 上传,托管在 IIS 上

c# - JSON.NET 解析嵌套数据类型

设置依赖属性后调用的 C# 函数

vb.net - 在 Visual Basic 中使用冒号将两个语句放在同一行

windows - 如何使用 MSYS2 在 Windows 上安装 GTK3 和 minGW

c - Splint静态分析器: not finding splint. rc配置文件(Windows)