inspect.exe做了什么来使控件可见?

问题描述 投票:1回答:1

我正在尝试通过UIAutomationCore.dll库进行特定控制。问题是,我无法从代码中看到它(找不到所需的子节点)和UISpy(它显示异常“UI自动化树导航被破坏。其中一个后代的父节点存在,但后代不是父节点的子节点“)直到我启动inspect.exe甚至一秒钟 - 然后它出现,这个效果一直持续到程序窗口重新打开。

有类似的question,但应用程序运行在同一个非管理员级别的UAC上。

这是我的代码。这是VS Code选项卡的一个示例,但我也遇到了Slack及其“文档”的问题。

static bool Do(IntPtr handle)
{      
    CUIAutomation8 uiAutomation = new CUIAutomation8();
    int propertyName = 30005;
    int propertyLocalizedType = 30004;

    IUIAutomationElement element = uiAutomation.ElementFromHandle(handle);

    if (element == null)    
        return false;    

    IUIAutomationCacheRequest cacheRequest = uiAutomation.CreateCacheRequest();
    cacheRequest.AddProperty(propertyName);

    IUIAutomationCondition tabCondition = uiAutomation.CreatePropertyCondition(propertyLocalizedType, "tab");

    IUIAutomationElementArray elements = element.FindAllBuildCache(
                    TreeScope.TreeScope_Descendants,
                    tabCondition,
                    cacheRequest);

    if (elements == null || elements.Length == 0) 
        return false;

    for (int i = 0; i < elements.Length; ++i)
    {
        //do something
    }
    return true;
}
c# ui-automation
1个回答
0
投票

我有一个非常相似的经历 - 在inspect.exe短暂运行之前,某些应用程序的UI树是不可见的。我最终发现将注册表项HKCU \ Control Panel \ Accessibility \ Blind Access \ On设置为“1”使其行为正常。真正有趣的部分是:

  • 应用程序本身不读取此注册表值。
  • 在您注销并重新登录之前,设置此注册表值后行为不会更改 - 无论您启动或停止应用程序多少次。
  • 运行应用程序大约20次后,我的代码试图读取它和Inspect.exe,即使没有运行Inspect.exe,一切都开始工作。显然,某个地方的东西在一段时间后会自行设置此注册表项。 (这是我发现它的方式)
  • 虽然缺少子树在Windows 7和8.1上具有很高的可重现性,但它在Windows 10上的重复性较低 - 仅发生在我们尝试过的4-5台机器中的一台机器上。
  • 但我找不到任何关于此注册表值实际意味着什么的文档。它似乎不直接映射到任何易用性设置。但是,我没有广泛看。
© www.soinside.com 2019 - 2024. All rights reserved.