6 c# vb.net windows winapi vba
我正在自动化第三方应用程序.登录窗口如下所示

注意:表单中嵌入了背景图像,USERNAME并且PASSWORD实际上它们都是图像的一部分.万一有人想知道为什么下面的类树视图Window Detective没有,可能是» Label控件.

获取组件句柄时没有任何问题.我的意思是,我通常可以使用FindWindowEx函数访问每个窗口/控件.
我可以实现一个GetWindowTextLength和/或GetWindowText按钮功能,以区分我有一个句柄.虽然这种方法适用于Buttons(.Caption),但在使用控件时这对我没有好处Edit.似乎Edit控件没有任何独特的属性来区分哪一个是哪个.(纠正我,如果我错了)......
假设我需要在编译阶段知道Edit我将要处理哪个控件,所以我不会向用户名和其他方式发送密码.只有两个,但我说我不知道如何得到正确的.
我不介意在运行时搞清楚但是我不确定如何在不发送消息的情况下区分差异并且实际上可视地识别哪个是哪个...
我不会真的称之为解决方案但是现在我只依赖于每次运行我的代码时我总是得到第二个(密码)Edit控件的句柄作为第一个句柄返回.
我可以100%确定第二个Edit控件将始终在FindWindowEx函数返回的层次结构中首先返回吗?
如果有人可以确认我的想法,而不是我已经有了解决方案,但如果我不能总是期望Edit返回第二个控件,那么我想听听一些关于如何处理这种情况的见解.
注意:我认为我的问题实际上并不需要任何代码,但如果有人想查看代码,请发表评论,我会将其添加到问题中.
非常感谢你的时间.
每个孩子HWND都有一个名为 的属性ID。使用GetWindowLongPtr( hWnd, GWLP_ID )即可获得。根据目标应用程序的编码方式,这ID可能是区分子控件的一种方法。知道您可以使用APIID获取子级(当父级不是 DialogBox 时工作正常,应该已调用 API )。HWNDGetDlgItemGetChildByID
请注意:某些目标应用程序确实使用随机/不可靠的 ID 值。
似乎有一个普遍的共识:枚举 API 依赖于 Z 顺序。例如,请参阅 SO答案(可能会使您的问题变得某种“重复”)
虽然某些应用程序可能会“玩弄”其子窗口的 Z 顺序,但在标准情况下它们不会,这意味着第一个创建的子窗口位于 Z 顺序的顶部,而最后创建的子窗口位于 Z 顺序的顶部。在底部。