答案有点晚,但我想更正此处选择的答案。是的,VS 提供的 COM 包装器确实可能使用不同的 UIAutomationClient.dll,并且在调用 UIAutomation 方法时使用本机代码与托管代码会有所不同,但是这里提出的问题是不同的问题。(顺便说一句,您可以使用托管代码中的 COM 包装器来调用 UIAutomation dll 的正确版本,这将解决诸如“inspect.exe 找到它但我的托管代码不能”之类的问题)。
我也遇到了这里提出的问题(我的问题是: FindAll(TreeScope.Children, TrueCondition) 没有返回任何东西,尽管 FindFirst() 成功地返回了同一控件上的子项)。
我尝试了 mike-z 的方法,使用 RawViewWalker 来寻找孩子,它在这种情况下效果很好。我正在写这个单独的答案,说问题不是 Find* 方法,而是导致 August 问题的 FindAll 和 FindFirst 方法之间的差异。
更新
对于 MS 工具,不一致的行为似乎是常态。进行此更新的原因是,我在使用 C# 的 tlbimp.exe'd RCW for uia 遇到了类似的问题,这次我编写了一个直接等效的 C 代码,令我惊讶的是它在 C# 代码中运行良好在试图找到一个简单的 OpenFileDialog 控件时拒绝以任何方式工作,然后在主窗体上找到另一个控件。两个世界的唯一区别是神秘的 MS RCW 魔法。我不确定这是否是使用自动创建的 COM 包装器(通过 tlbimp)或其他方式处理封送处理的方式。并且为创建的界面显示的 [ComConversionLoss] 属性对我来说听起来不正确。反正我