ウィンドウが表示されない

こんにちは。 PlatformSDK( Windows SDK) サポート チームで、ユーザーインタフェース(UI) を担当していますhiroakii です。
UI というと漠然としていますが、主には Windows Forms、WPF、Silverlight などの目に見える部分の技術が該当します。
もちろん .NET だけでなく Win32API で作成されたウィンドウなどもサポートしています。

本ブログの中では、UIに関連する情報として、開発に役立つツールやプログラム方法などをご紹介していきたいと思います。

ウィンドウが表示されない
UI といえば、「ウィンドウ」や、ウィンドウ上に配置されるボタンなどの「コントロール」が中心となりますが、それらが「想定していた通りに表示されない」というご質問をいただきます。
しかし、その状況はさまざまで、例えば、

・そもそもウィンドウが表示されていない。表示の前に処理が止まっている。
・表示しているが、他のウィンドウの後ろに表示されてしまっている。
・なぜか非表示 (Hide) になっている。
・ディスプレイの表領域外に表示されている。

など多くの状況があります。

また、状況が同じでも、それに至った原因はそれぞれで、一概にこれが原因と判断することができません。
ということで、見た目だけでは原因を特定することが難しい問題ですが、まずは、どういう状況なのかを判断するため、ツールを使ってウィンドウの状態を確認してみることをお勧めします。

ウィンドウやコントロールの状態を確認するツールとしては、Visual Studio などに含まれる Spy++ (spyxx.exe) が代表的です。
Visual Studio 2010 をインストールされている場合、[スタート メニュー] から [すべてのプログラム] – [Microsoft Visual Studio 2010] – [Visual Studio Tools] – [Spy++] より実行できます。

Spy++ は、Win32 API や MFC などで Windows アプリケーションを開発されている方には、お馴染みのツールだと思います。
例えば、「メモ帳」を実行して Spy++ でメモ帳のウィンドウのプロパティを開いてみると、以下のような情報を確認することができます。 

 

 

この情報から、メモ帳のウィンドウハンドルや、サイズ、位置などが確認できますし、別のタブを開くと、ウィンドウのスタイルや、前後のウィンドウなど、さらに多くの情報が確認できます。

また、Spy++ では、Windows Forms アプリケーションのForm やコントロールの情報を確認することもできます。
以下の図は、Windows Forms アプリケーションの Form に対して、Spy++ の Finder Tool を使った例ですが、TextBox の情報が確認できていることが分かります。

 

このように、Spy++ は、Visual C++ で作成されたアンマネージ コードのアプリケーションだけでなく、Visual C# や Visual Basic で作成されたマネージ コードのWindows Forms アプリケーションにおいても、ウィンドウやコントロールの情報を確認することができます。

しかし、WPF やSilverlight のアプリケーションの場合、Spy++ を使用しても、コントロールの情報を確認することはできません。
以下の図は、WPF アプリケーションのウィンドウで Spy++ の Finder Tool を使用している例ですが、この場合には、TextBox や RadioButton に Finder Tool を移動しても、ウィンドウの情報しか確認することができません。

 

これは、WPF と Silverlight のアプリケーションは、コントロールの作成方法が、Windows Formsアプリケーションなどと違うためです。

WPF アプリケーションの場合、Spy++ に代わるツールとして Codeplex (https://www.codeplex.com/) で、Snoop と呼ばれるツールが公開されています。(https://snoopwpf.codeplex.com/)
以下の図は、先ほどの WPF アプリケーションのウィンドウの情報を Snoop で確認しているところですが、ウィンドウ内の階層やコントロール( TextBox) のプロパティなどが表示されていることがご覧いただけます。

 

 

今回 ご紹介したツールを使用して、ウィンドウやコントロールの情報を確認することで、ウィンドウが現在どのような状況にあるのかを把握することができます。
通常は、そのような状況に至った原因を調査するために、さらにデバッグなどが必要になりますが、切り分けのために、これらのツールをご活用いただければと思います。
なお、Spy++ や Snoop を使用すると、ウィンドウやコントロールの動作に不可欠な、メッセージやイベントの動きを把握することもできますので、デバッグの一つの方法としても利用できます。

Silverlight に対しては、現時点で、マイクロソフトおよび関連サイトにおいて、同様のツールは用意されておりません。 ただし、Silverlight Spy と呼ばれるツールも公開されていますので、ご興味あるかたは調べてみてください。