0

私が開発したいくつかのスクリプト (Windows UI オートメーション サポートを使用して GUI オブジェクトを識別するスクリプト) をデバッグしようとしていますが、ツリー内で特定のコントロールが見つからないために断続的に失敗します。テストしているウィンドウの状態を確認するためにスクリーンショットも使用していますが、コントロールは GUI にあるようですが、ツリー内を検索しても見つかりません (数秒間スリープした後でも)。inspect.exe を使用してツリーを確認すると、オブジェクトが存在します。

後で分析するためにそのツリーをダンプする方法はありますか? 今まで見つけた唯一の方法は、ツリー全体を再帰的にクロールすることですが、これは非常に時間がかかるため実行できません。

4

1 に答える 1

2

これが私のコードです:

public static string DumpUIATree(this AutomationElement element, bool dumpFullInfo = false)
{
  var s = element.Name() + " : " + element.ControlType().ProgrammaticName;
  DumpChildrenRecursively(element, 1, ref s, dumpFullInfo);
  return s;
}

private static List<AutomationElement> GetChildNodes(this AutomationElement automationElement)
{
  var children = new List<AutomationElement>();
  TreeWalker walker = TreeWalker.ControlViewWalker;
  AutomationElement child = walker.GetFirstChild(automationElement);
  while (child != null)
  {
    children.Add(child);
    child = walker.GetNextSibling(child);
  }
  return children;
}

private static void DumpChildrenRecursively(AutomationElement node, int level, ref string s, bool dumpFullInfo = false)
{
  var children = node.GetChildNodes();
  foreach (var child in children)
  {
    if (child != null)
    {
      for (int i = 0; i < level; i++)
        s += "-";
      s += " " + child.Name() + " : " + child.ControlType().ProgrammaticName + "\r\n";

      if (dumpFullInfo)
      {
        foreach (var prop in child.GetSupportedProperties())
        {
          s += "   > " + prop.ProgrammaticName + " = " + child.GetCurrentPropertyValue(prop) + "\r\n";
        }

        s += "\r\n";
      }

      DumpChildrenRecursively(child, level + 1, ref s, dumpFullInfo);
    }
  }
}
于 2014-06-25T11:52:48.213 に答える