はじめに
C# で Windows アプリケーションを作っているとき(つまり、今である…(;´д`)トホホ)に、ダイアログボックスが上手く表示されない現象が発生し、その対応策を見つけるまでにしばらく時間を費やしてしまいました。ネットで検索するも、そのものずばりの解決策を探し出すのに意外と手間取りましたので、ここに解決策を記しておきます。
ちなみに、Owner の指定はもちろんしています。それでも何故か各種ダイアログボックスが上手く表示されなかったので、困ってしまっていた状況です。
現象
SaveFileDialog で上書き確認を有効にしている状況で、ファイルの上書きを実施する場合、本当に上書きするのか?といった確認ダイアログが表示されます。私が遭遇した現象は、なぜか、この確認ダイアログボックスが正常に表示されない、といったものです。ちなみに実験のため、自前でファイルチェックを行い、既存のファイルが存在する場合に MessageBox を表示しようとしても、まったく同様の状況となりました。
正常に表示されない件について、もう少し詳しく説明します。該当のメッセージボックスは全く表示されません。これは他のフォームの下になっているとかではありません。そもそも表示されていません。この状況の時に Alt+Tab を何度か押下すると、表示されていなかったダイアログボックスが表示されるようになるのですが、フォームがダイアログボックスを覆い隠す状況でなくとも、ダイアログボックスが表示されないことが確認できていますので、全く表示されていない、ことが確認できます。
SaveFileDialog の場合、警告音は鳴ります。そして、MessageBox を呼び出しているフォームは一切操作することはできない状況に陥ります。このような一切操作できない状態にて、何度か Alt+Tab キーを押下すると、ダイアログボックスが最前面に表示されるようになり、それ以降は正常に機能する、という状況です。
原因と解決方法
原因は、ダイアログボックスを呼び出しているフォーム(もしくは、そのフォーム上にあるコンポーネント)におけるオーナードローでした。以下のページ(英語ですが…)に、まさにそのことが書いてあります。
Modal common dialog not showing until pressing the alt key
同様の現象に遭遇した方は、まず、独自の描画(=オーナードロー)を行っていないかどうかを確認してみましょう。もし、オーナードローを行っているのであれば、そのコンポーネントの Visible を false に設定し、SaveFileDialog を Show する等してみましょう。問題が解消するかもしれません(もちろん、ダイアログの表示が終わったら、該当コンポーネントの Visible を true に戻すことを忘れないようにしましょう)。
おわりに
久しぶりに C# で Windows アプリを作ったら、妙なところでハマってしまました。同様の現象で困っている方々に対し、少しでも問題解決のヒントにでもなれば幸いです。