WPFアプリケーションをレイヤー付きで可視化するツールの制作


今日の記事はFriendly Advent Calender 2014 20日目のエントリーです。

Friendly Advent Calendar 2014 - Qiita

本日のエントリはFriendlyのAdvent Calenderでありつつ、WPF(XAML) Advent Calender番外編でもあります。
私は、大阪のフィードテイラーというスマホ/タブレット向けのソフトウェア開発の会社でWindowsプラットフォームを担当しています。
この1年半でC#WPF、ストアアプリ開発に真剣に取り組んできた中で、関西で知り合った勉強会仲間たちから教わった技術を総動員して、今できる2014年の集大成的なツールでも作ってみようかと思ったのを形にしてみました。

プログラマなんで口では仕事できないので、ソースコードか動くプログラムで語りたいと思います。

私は可視化が好きだ。
コンピューターグラフィックスが好きだ。
インタラクティブなのはもっと好きだ。
みうみう風)

というわけで、ネタ的にはコンピュータグラフィックス的と言うかお絵かき的な簡単なツールの技術検証プロトを制作したいと思います。
先月末にあっためとべや大阪で準備したWPF3Dと今年6月のAsian Automation Alliance(通称:みうみう祭り)で発表したFriendlyを組み合わせて可視化ツールをぱぱっと作ってみたいと思います。

2014/11/29 Room metro #28 大阪 「XAML Day」 Room metro #28
2014/6/28 Asian Automation Alliance 6月28日 Asian Automation Alliance ~自動化を語り合おう!(2014/06/28)(兵庫県)

実現したいことは

  • 実行中の別プロセスのWPFアプリケーションのコントロールを集める
  • 3D CGで表示する
  • マウスで拡大縮小したりグリングリン動かしたりする
  • コントロール階層を選んだらCG上でも選択される

です。あんまり時間が取れなかったので、最低限しか実現できてませんが動作イメージは↓こんな感じ。
表示対象のアプリケーションはAtlassianのSourceTree(みんな使ってるよね!)の例です。

実現するにあたっていろいろと課題がありました。解決できていない問題もいろいろと残っています。
が、Friendlyの実行中の別プロセスから情報を持ってくると言う強力な能力とWPF 3Dを組み合わせることでこんなこともできるんだなって言うのを実際に動かして感じてもらいたいです。

初期状態

拡大中

グリングリン

コントロールの選択

ここまでのソースコードGitHubにあげていますので、開発環境のある方は是非試してみてください。

GitHub - fuku518/WpfVisualizer

ほんで感想とかいただけると嬉しいです。

使い方

  1. GitHubからクローンします
  2. 3D Tools for the Windows Presentation Foundation をダウンロードします。 https://3dtools.codeplex.com/
  3. Petzold.Media3D library(Charls Petzold!!!) http://www.charlespetzold.com/3D/Petzold.Media3D.dll
  4. プロジェクトの参照に上の2つのDLLを追加します
  5. ビルドして実行

操作方法

  1. Select Appボタンで解析したい対象のWPFアプリケーションを選択します
  2. 3D で可視化されたら、マウスのドラッグ、マウスホイール、F1 キー、左のツリーコントロール上で選択ができます。

制限事項

  1. DLLインジェクションを使ってるので、操作後に解析対象のアプリを再起動しないといけないと思います
  2. 解析対象のアプリと同じターゲットでビルドする必要があります。x64アプリならWpfVisualizerもx64でビルドしてください
  3. WPF アプリでも解析できないアプリがいろいろあると思います(まあ、アルファ版なので)
  4. レンダリングに失敗するコントロールが山ほどあります(ノウハウいりそう)


世界一のテスト自動化ライブラリーFriendlyの存在を知らなかったら、このツールを作れなかったですし、作れるとも思わなかったと思います。
Friendlyはテスト自動化ライブラリーなんですが、テスト以外のツール(実行時の解析系)に広く応用がきくと思います。

以上で今回の Friendly Advent Calender 2014 featuring WPF は終わりです。
徹夜しながら作ったので、最後の方はぼーっとしてきて全然バグが取れなくて死にそうでした。でも、ここまでできたので満足です!