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

时间:2018-01-03 09:50:23

标签: c# ui-automation

我试图通过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;
}

1 个答案:

答案 0 :(得分: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台计算机中的一台上。

  • 我找不到任何有关此注册表值实际表示的文档。它似乎没有直接映射到任何“易用性”设置。但是,我看起来并不广泛。