DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームとタスクバーの関係について

環境/言語:[WinXP SP3、C#、.NET3.5 SP1]
分類:[.NET]

こんにちわ。

複数のフォームをShowで開いて、
開いたフォームからShowDialogで新しいフォームを開いた時
タスクバーでフォームを切り替えるとアクティブになるが操作できない。


1.FormMain から FormA と FormB を Show(this) で表示
2.FormA から FormC を ShowDialog(this) で表示
3.タスクバーで FormB を表示するとアクティブになるが操作できません

動作として FormB を表示しても ShowDialog で表示したフォームをアクティブにしたいのですが
問題を解決する良い方法が見つかりません。
ご教授お願いします。
■No27584に返信(まとぱぱさんの記事)
> 動作として FormB を表示しても ShowDialog で表示したフォームをアクティブにしたいのですが

実験してみました。VB6 で同じ処理を行うと、
 ・タスクバーで FormMain を選択すると、FormC がアクティブになる。
 ・タスクバーで FormA を選択すると、FormC がアクティブになる。
 ・タスクバーで FormB を選択すると、FormB が一瞬アクティブになるものの、
  すぐに FormC がアクティブになる。
という状態になりましたが、.NET の場合は、
 ・タスクバーで FormMain を選択すると、FormC がアクティブになる。
 ・タスクバーで FormA を選択すると、FormA がアクティブになるが、
  その後で FormA を操作しようとすると、FormC がアクティブになる。
 ・タスクバーで FormB を選択すると、FormB がアクティブになり、操作できない。
となりますね。

VB6 の時は、ランタイム側で何かしているのかな…。


> 問題を解決する良い方法が見つかりません。
VB6 互換の動作を行う拡張メソッドを用意してみました。


// 利用方法
using (Form FormC = new Form() { Text = "FormC" })
{
    // FormC.ShowDialog(FormA);
    FormC.ShowDialogEx(FormA);
}


// 拡張メソッドの定義
public static class VB6Compatible
{
    public static DialogResult ShowDialogEx(this Form target, IWin32Window owner)
    {
        EventHandler act = delegate { target.Activate(); };
        foreach (Form f in Application.OpenForms) f.Activated += act;
        DialogResult result = target.ShowDialog(owner);
        foreach (Form f in Application.OpenForms) f.Activated -= act;
        return result;
    }
    public static DialogResult ShowDialogEx(this Form target)
    {
        return ShowDialogEx(target, null);
    }
}
魔界の仮面弁士さん

お返事が遅くなり、申し訳ありません。

提示してくださったコードで無事解決しました。
本当にありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板