/// <summary>
        /// ウィンドウ情報作成
        /// </summary>
        /// <param name="target">対象</param>
        /// <param name="rootPos">ルート位置</param>
        /// <param name="logicalIndex">ロジカルインデックス</param>
        /// <param name="visualIndex">ビジュアルインデックス</param>
        /// <returns>ウィンドウ情報</returns>
        static WindowInfo CreateWindowInfo(object target, System.Windows.Point rootPos, List<int> logicalIndex, List<int> visualIndex)
        {
            WindowInfo info = new WindowInfo();

            //情報設定
            info.TargetObject = target;
            info.TypeFullName = target.GetType().FullName;
            FrameworkElement frameworkElement = target as FrameworkElement;
            if (frameworkElement != null)
            {
                try
                {
                    System.Windows.Point pos = frameworkElement.PointToScreen(new System.Windows.Point(0, 0));
                    info.Bounds = new Rectangle((int)(pos.X - rootPos.X), (int)(pos.Y - rootPos.Y),
                        (int)frameworkElement.ActualWidth, (int)frameworkElement.ActualHeight);
                }
                catch { }
            }
            info.LogicalTreeIndex = logicalIndex.ToArray();
            info.VisualTreeIndex = visualIndex.ToArray();
            return info;
        }
 /// <summary>
 /// リストの中から参照が一致するインデックスを見つける。
 /// </summary>
 /// <param name="list">リスト。</param>
 /// <param name="obj">オブジェクト。</param>
 /// <returns>インデックス。</returns>
 private static int IndexOf(List<WindowInfo> list, WindowInfo obj)
 {
     for (int i = 0; i < list.Count; i++)
     {
         if (ReferenceEquals(obj.TargetObject, list[i].TargetObject))
         {
             return i;
         }
     }
     return -1;
 }
 /// <summary>
 /// インデックスをお互い持ち合う
 /// </summary>
 /// <param name="visualInfo">ビジュアル情報</param>
 /// <param name="info">ロジカルツリー情報</param>
 static void MutualIndex(WindowInfo[] visualInfo, WindowInfo[] logicalInfo)
 {
     List<WindowInfo> faltVisual = new List<WindowInfo>();
     ToFlat(visualInfo, faltVisual, false);
     List<WindowInfo> faltLogical = new List<WindowInfo>();
     ToFlat(logicalInfo, faltLogical, false);
     for (int i = 0; i < faltVisual.Count; i++)
     {
         int findIndex = IndexOf(faltLogical, faltVisual[i]);
         if (findIndex != -1)
         {
             faltLogical[findIndex].VisualTreeIndex = faltVisual[i].VisualTreeIndex;
         }
     }
     for (int i = 0; i < faltLogical.Count; i++)
     {
         int findIndex = IndexOf(faltVisual, faltLogical[i]);
         if (findIndex != -1)
         {
             faltVisual[findIndex].LogicalTreeIndex = faltLogical[i].LogicalTreeIndex;
         }
     }
 }
 /// <summary>
 /// ツリー構造からフラットなリストに変更
 /// </summary>
 /// <param name="infos">情報</param>
 /// <param name="list">リスト</param>
 /// <param name="clearChildren">子をクリアするか</param>
 static void ToFlat(WindowInfo[] infos, List<WindowInfo> list, bool clearChildren)
 {
     foreach (WindowInfo info in infos)
     {
         list.Add(info);
         ToFlat(info.Children, list, clearChildren);
         if (clearChildren)
         {
             info.Children = new WindowInfo[0];
         }
     }
 }
        /// <summary>
        /// 重複をマージする
        /// </summary>
        /// <param name="visualInfo">ビジュアル情報</param>
        /// <param name="info">ロジカルツリー情報</param>
        /// <returns>重複を取り除いたビジュアル要素</returns>
        static WindowInfo[] MergeDuplication(WindowInfo[] visualInfo, WindowInfo[] logicalInfo)
        {
            List<WindowInfo> faltVisual = new List<WindowInfo>();
            ToFlat(visualInfo, faltVisual, true);
            List<WindowInfo> faltLogical = new List<WindowInfo>();
            ToFlat(logicalInfo, faltLogical, true);

            for (int i = faltVisual.Count - 1; 0 <= i; i--)
            {
                int logicalInfoIndex = IndexOf(faltLogical, faltVisual[i]);
                if (logicalInfoIndex != -1)
                {
                    faltLogical[logicalInfoIndex].VisualTreeIndex = faltVisual[i].VisualTreeIndex;
                    faltVisual.RemoveAt(i);
                }
            }
            faltLogical.AddRange(faltVisual);
            return faltLogical.ToArray();
        }