winforms IsKeyboardFocusable在Inspect Object中为true,但在我的应用程序中始终为false

w6mmgewl  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(165)

我正在学习UI自动化,我发现我的“Inspect Object”克隆显示IsKeyboardFocusable总是false,即使它是true,所有其他信息都是相同的(正如您可以从图像中看到的)。有人知道为什么我在检索值时会看到此属性为false吗?

b4wnujal

b4wnujal1#

Inspect Object应用程序中,最新版本的Windows自动化COM API(3.0)用于显示所有这些属性。但是默认的.NET UIAutomation实现不是基于Windows Automation API 3.0 COM接口的(它基于此COM API的以前版本)。因此,某些属性无法正常工作。例如,对于Skype“的联系人列表,AutomationElement.IsKeyboardFocusableProperty属性表示根本不支持获取此属性的值。您可以使用以下代码片段检查这一点:

object isKeyboardFocusable = listItem.GetCurrentPropertyValue(AutomationElement.IsKeyboardFocusableProperty, true);
if(isKeyboardFocusable == AutomationElement.NotSupported) {
    // we will always goes here
}

现在,我不知道如何使用当前的.Net UIAutomation实现来避免这种行为。
好消息是,.NET中有替代的UI Automation实作,可以使用新的Windows Automation API 3.0 COM界面,以及改善的可靠性和效能,同时仍使用与旧版UI Automation相同的System.Windows.Automation类别。这个实作可以CodePlex上的项目取得:UI Automation COM-to-.NET Adapter
因此,今天尝试了这个替代实现,通过这个替代实现,IsKeyboardFocusable属性返回与Inspect Objects工具相同的结果!此外,现在可以使用Inspect Objects显示的一些扩展属性(例如LegacyIAccessible成员)。

vfhzx4xs

vfhzx4xs2#

IsKeyboardFocusable的内部实现使用GetCurrentPropertyValue(属性:自动化元素。是键盘可聚焦属性,忽略默认值:false)函数。如果失败,它只返回false(而在您的情况下,它也失败了)。因此,我建议您使用GetCurrentPropertyValue(属性:自动化元素。是键盘可聚焦属性,忽略默认值:true)而不是IsKeyboardFocusable,这样您就可以知道它是否失败。
通过使用winapi,您可以获得与Inspect完全相同的结果。Olecc.dll为您提供IAccessible interface(这个接口有更详细的description)。这个接口的一个示例可以有子示例,一部分可以有焦点,一部分没有。如果你从HWnd创建IAccessible,你不能确定整个控件是否有焦点。为了确定,您应该从屏幕上的点创建IAccessible-它会准确地为您提供该点下的IAccessible(您可以在屏幕截图上看到,Inspect使用屏幕上的点-“How found - Mouse move(1120,470)”)。此外,如果您在Inspect中从UIAutomation模式切换到MSAA,您可以看到IAccessible的外观。
但是,如果在您的情况下可能,最好使用alternative implementation of UIAutomation。它返回正确的IsKeyboardFocusable值(与标准UIAutomation实现不同)。我没有亲自测试过这个库(我只测试了IsKeyboardFocusable),但看起来它工作得很好,而且它具有与标准实现相同的类型和接口。而不是来自HWnd。
关于你的问题-我还不知道,为什么标准的UI自动化在某些情况下不能正确地返回AutomationElement.IsKeyboardFocusableProperty。我想,这可能是一个bug。

px9o7tmv

px9o7tmv3#

你有没有试过这个UI自动化间谍工具:http://automationspy.freecluster.eu/?我发现IsKeyboardFocusableProperty为true的情况,例如Skype应用程序的菜单栏。

相关问题