1

2つのフォームがありますform1はメインフォームで、フォーム2はモデルフォームです。フォームを次のように設定します。

Form1

private void button1_Click(object sender, EventArgs e)
{
        Form2 f2 = new Form2();
        f2.Show(this);

}

上記はform2のform1所有者を設定し、form2が表示されますが、問題は、Alt + Tabキーを押すとフォームの順序が崩れるため、以下の別の方法で試してみました。

 private void button1_Click(object sender, EventArgs e)
 {
        Form2 f2 = new Form2();
        f2.ShowDialog(this);

 }

これはうまくいくでしょうが、問題は、ダイアログフォームでは最大化/最小化して閉じることができないということです

私のform2はフチなしフォームで、メインのform1に合うように特定の場所に表示されるように設定されています。Alt + Tabリストにform2を表示しないことを目的としており、form2を閉じると、form1はフォームの区切り順序なしですぐに表示されます。

最初の条件でAlt+Tabキーを押して、form2を閉じようとすると、form1の代わりに他のアプリケーションが表示されます。これは不要です。

この問題の解決策はありますか?

4

2 に答える 2

-1

考えられるハックは、子フォームをモーダルフォームとして開いた後、親フォームをアクティブのままにして、親も最大化/最小化できるようにすることです。拡張方法:

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool EnableWindow(IntPtr hWnd, bool enable);
public static DialogResult ShowDialogSpecial(this Form formToBeShown, Form parent)
{
    parent.BeginInvoke(new Action(() => EnableWindow(parent.Handle, true)));
    formToBeShown.ShowDialog(parent);

    return formToBeShown.DialogResult;
}

あなたは呼び出すことができます:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    //additionally do f2.ShowInTaskbar = false to make sense.
    f2.ShowDialogSpecial(this);
}

これにより、子フォームが親フォームを覆うことができるため、子フォームが実際には非モーダル フォームとして機能することはありません。

于 2012-11-01T14:57:53.830 に答える