1

と という 2 つのフォームがOneありTwo、両方のタイトル テキストは名前と同じです。

Oneボタンがあり、そのクリックイベントが含まれています。

Two l_objTwo = new Two();
l_objTwo.Show();            
MessageBox.Show("Two Closed");

が開き、Twoその後「Two Closed」メッセージがポップアップ表示されます。

私のシーンは、Twoある方法で開くModeless必要があります。つまり、制御が必要Oneであると同時に、Two閉じた後にいくつかの機能を実行する必要があります。今のところ、私はのように使用しています、

[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(String sClassName, String sAppName);

Two l_objTwo = new Two();
l_objTwo.Show();
IntPtr l_objHandle = FindWindow(null, "Two");
while ((int)l_objHandle > 0)
{
    l_objHandle = FindWindow(null, "Two");
    Application.DoEvents();
}
MessageBox.Show("Two Closed");

正常に動作していますが、これがこれを達成する唯一の方法ですか?

4

3 に答える 3

1

いいえ、それが唯一の方法ではありません。最初のフォームは、2 番目のフォームのいずれかFormClosedまたはFormClosingパブリック イベントにハンドラーをアタッチします。

2 番目のフォームが閉じるとイベントが発生し、最初のフォームは 2 番目のフォームが閉じていることを認識します。

このスニペットを使用してください:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f = new Form2();
        f.FormClosed += new FormClosedEventHandler(FormClosedHandler);
        f.Show();
    }
  void FormClosedHandler(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Second form has closed.");
    }
于 2012-03-12T11:23:04.993 に答える
1

イベント ハンドラーを使用する

var two = new Two();
two.Closed += OnTwoClosed;
two.Show();

private void OnTwoClosed(object sender, EventArgs e)
{
    MessageBox.Show("Two Closed")
}

このコードを winforms でテストしたことはありませんFormが、プリンシパルは同じであり、固有の落とし穴がある Windows API を使用するよりも簡単です。

もう 1 つの利点は、ウィンドウのタイトルを好きなようにできることです。

ここを確認するClosedFormClosed、有効なイベントの両方が表示されます。

于 2012-03-12T11:25:23.260 に答える
0

これは周りが散らかっているように見えます。ここで何を達成したいのかわからない。One のイベント ハンドラーでフォーム 2 を開き、Two の onclose-event を MessageBox にフックするだけです。

于 2012-03-12T11:24:52.670 に答える