QA@IT
«質問へ戻る

質問を投稿

他者が Form を ShowDialog/Show した瞬間に、自分の処理を動かしたい

既存の Windows Forms Application 用のプラグインのコードを Visual C# 2010 Express で 作っています。

先日の質問、
「MessageBox を表示中に、その MessageBox のインスタンスにアクセスしたい」
http://qa.atmarkit.co.jp/q/3120
と背景は同一です。

既存のアプリケーションがおそらく Form を ShowDialog/Show していて、画面上にその Form が出現するのですが、その出現した瞬間にプラグインの中で自分のコードを実行したいと考えています。
今はプラグインの中で定期的にポーリングして、親となる Form の OwnedForms の Length の値の増加を検査することで一応は実現できていますが、やはりどうしても最大でポーリング間隔の時間、平均でポーリング間隔の半分の時間だけ遅れてしまうので、遅れがないように Form が ShowDialog/Show されるタイミングで raise されるようなイベントがあればそのイベントを捉えたいと思います。そういうイベントはありますか?

以下に、コンテキストを説明する擬似コードを示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.ShowDialog(this);
            //f.Show(this);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(this.OwnedForms.Length);
        }
    }
}

Form2 を new したり ShowDialog あるいは Show する箇所は、既存のコードが動いていてそこは私がいじることができません。button1 は説明のために付けたイベントハンドラーであり、実際にはどんなイベントで Form2 が new されたり ShowDialog/Show されているのかは不明です。
タイマー(timer1)をしかけることはでき、Form1 の OwnedForms などのプロパティーにアクセスしたり、Form1 のイベントハンドラーにアクセスすることはできます。プラグインのロード時に Form1 のプロパティーやメソッド/イベントハンドラーにアクセスすることもできます。

技術的な課題は、Form2 が ShowDialog/Show されるタイミングを捕まえることだけです。Form2 が出現してしまえば、Form2 のインスタンスには上記のように OwnedForms などを経由して自由にアクセスできます。よろしくお願いします。

既存の Windows Forms Application 用のプラグインのコードを Visual C# 2010 Express で 作っています。

先日の質問、
「MessageBox を表示中に、その MessageBox のインスタンスにアクセスしたい」
http://qa.atmarkit.co.jp/q/3120
と背景は同一です。

既存のアプリケーションがおそらく Form を ShowDialog/Show していて、画面上にその Form が出現するのですが、その出現した瞬間にプラグインの中で自分のコードを実行したいと考えています。
今はプラグインの中で定期的にポーリングして、親となる Form の OwnedForms の Length の値の増加を検査することで一応は実現できていますが、やはりどうしても最大でポーリング間隔の時間、平均でポーリング間隔の半分の時間だけ遅れてしまうので、遅れがないように Form が ShowDialog/Show されるタイミングで raise されるようなイベントがあればそのイベントを捉えたいと思います。そういうイベントはありますか?

以下に、コンテキストを説明する擬似コードを示します。

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.ShowDialog(this);
            //f.Show(this);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(this.OwnedForms.Length);
        }
    }
}
```

Form2 を new したり ShowDialog あるいは Show する箇所は、既存のコードが動いていてそこは私がいじることができません。button1 は説明のために付けたイベントハンドラーであり、実際にはどんなイベントで Form2 が new されたり ShowDialog/Show されているのかは不明です。
タイマー(timer1)をしかけることはでき、Form1 の OwnedForms などのプロパティーにアクセスしたり、Form1 のイベントハンドラーにアクセスすることはできます。プラグインのロード時に Form1 のプロパティーやメソッド/イベントハンドラーにアクセスすることもできます。

技術的な課題は、Form2 が ShowDialog/Show されるタイミングを捕まえることだけです。Form2 が出現してしまえば、Form2 のインスタンスには上記のように OwnedForms などを経由して自由にアクセスできます。よろしくお願いします。