QA@IT
«回答へ戻る

5619
 上記の状況が作れなかったので、拾えない状況はわかりませんでした。
 
 
-ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。  
-(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
+ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。 (具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
 → (書いている途中で思い出しました)
 
 とりあえずForm1, Form2という名前ではなんだかわからないので `ParentAppForm` と `ChildPluginForm` という名前で説明させてもらいます。

以下のようなForm ChildPluginForm (Form2と言われていたもの相当)を別プロジェクトのForm ( ParentAppForm )から呼び出してみました。
(面倒だったのでプロジェクト参照してインスタンス作って Show() しているだけですので実際の方式とは違うとは思います。)
実際には winuser.h から WM_xxx引っこ抜いてソースに自動変換したのでWMsgToStringはもっと大量です。

たしかにWM_CREATEとWM_NCCREATEはインスタンス作る時しか出ませんね(当たり前といえば当たり前ですかね。)

WM_ACTIVATEとWM_NCACTIVATEはたしかにShowするたびに発生しているような気がします。

たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。

上記の状況が作れなかったので、拾えない状況はわかりませんでした。

ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。 (具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
→ (書いている途中で思い出しました)

とりあえずForm1, Form2という名前ではなんだかわからないので ParentAppFormChildPluginForm という名前で説明させてもらいます。
途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これはMonitorPluginForm とさせていただきます。

  • ゴール: MonitorPluginForm から ChildPluginForm が (ParentAppForm によって) Show ShowDialog されたことを検知したい
    • 今の流れは私がWM_CREATEWM_ACTIVATE あたりを拾えばよいといったので WM_ACTIVATEだが、アクティブになったことを検知したい?
    • WM_SHOWWINDOWは不要?
  • 前提: ChildPluginForm のコードは変更できない(ソースも見れない?)
  • 前提: ChildPluginFormParentAppForm から呼び出されるプラグインのようなもの。
  • 前提: ParentAppForm はプラグインの親となるアプリケーション
  • 前提: ParentAppForm は変更できない(ソースも見れない?)
  • 前提: MonitorPluginForm が現在コードを作成しているオブジェクト
  • 前提: MonitorPluginForm はコード編集できる
  • 前提: MonitorPluginFormParentAppForm から呼び出されるプラグインのようなもの。
  • 前提: ParentAppForm のインスタンスには MonitorPluginForm.Parent でアクセスできる?
  • 前提: ChildPluginForm のインスタンスには ParentAppForm 経由で ParentAppForm.OwnedForms から探せばアクセスできる

ローカルフックで同一プロセスのメッセージを拾えばいけるかも。
デバッグ中に ChildPluginForm がWM_ACTIVATEが発行されていないことがあるように思う ←今ここ

という状況でしたっけ?

回答書いてる途中でMonitorPluginFormの存在思い出したので以下のコードは前提とちょっと違いますが(対象のコードをいじってるので)、関連ありそうなメッセージを拾って判断するしかないでしょうね。

デバッグ中の件は本当に前にでる必要がなくなって、WindowsがWM_ACTIVATEを発行していないのかもしれません。ちらっとでもウィンドウが見えるとかタスクバーがハイライトされるのに拾えないなら不思議ですね。
無視した場合でもメッセージは発行されますので、それ以外だと自分より先に処理されて自分まで通達が来ていない場合も考えられますね。

namespace ChildPlugin
{
    public partial class ChildPluginForm : Form
    {
        bool seekWM = true;
        StringBuilder sb = new StringBuilder(10240);

        public ChildPluginForm(){
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e){
            seekWM = false;
        }

        protected override void WndProc(ref Message m){
            if (seekWM)
            {
                var msgString = WMsgToString(m.Msg);
                if (msgString == null) msgString = m.Msg.ToString("x9");

                sb.AppendLine(m.HWnd.ToString("X9") + "  " + msgString);
            }

            base.WndProc(ref m);
        }

        private void ChildPluginForm_Paint(object sender, PaintEventArgs e){
            var s = sb.ToString();
            if (s != textBox1.Text)
            {
                textBox1.Text = "";
                textBox1.AppendText(s);
                // textBox1.ScrollToCaret();
            }
        }


        private static string WMsgToString(int msg){
            var msgString = "";
            switch (msg){

                case 32768:
                    msgString = "WM_APP";
                    break;
                case 6:
                    msgString = "WM_ACTIVATE";
                    break;
                case 134:
                    msgString = "WM_NCACTIVATE";
                    break;
                case 28:
                    msgString = "WM_ACTIVATEAPP";
                    break;
                case 3:
                    msgString = "WM_MOVE";
                    break;
                case 534:
                    msgString = "WM_MOVING";
                    break;
                case 130:
                    msgString = "WM_NCDESTROY";
                    break;
                case 1:
                    msgString = "WM_CREATE";
                    break;
                case 129:
                    msgString = "WM_NCCREATE";
                    break;

                case 24:
                    msgString = "WM_SHOWWINDOW";
                    break;

                default:
                    return null;
            }

            return msgString;
       }
}
以下のようなForm `ChildPluginForm` (Form2と言われていたもの相当)を別プロジェクトのForm ( `ParentAppForm` )から呼び出してみました。
(面倒だったのでプロジェクト参照してインスタンス作って Show() しているだけですので実際の方式とは違うとは思います。)
実際には winuser.h から WM_xxx引っこ抜いてソースに自動変換したのでWMsgToStringはもっと大量です。


たしかにWM_CREATEとWM_NCCREATEはインスタンス作る時しか出ませんね(当たり前といえば当たり前ですかね。)  
WM_ACTIVATEとWM_NCACTIVATEはたしかにShowするたびに発生しているような気がします。

> たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。

上記の状況が作れなかったので、拾えない状況はわかりませんでした。


ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。 (具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
→ (書いている途中で思い出しました)

とりあえずForm1, Form2という名前ではなんだかわからないので `ParentAppForm` と `ChildPluginForm` という名前で説明させてもらいます。
途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これは`MonitorPluginForm` とさせていただきます。

* ゴール: `MonitorPluginForm` から `ChildPluginForm` が (`ParentAppForm` によって) `Show` `ShowDialog` されたことを検知したい
  * 今の流れは私が`WM_CREATE`や`WM_ACTIVATE` あたりを拾えばよいといったので WM_ACTIVATEだが、アクティブになったことを検知したい?
  * WM_SHOWWINDOWは不要?
* 前提: `ChildPluginForm` のコードは変更できない(ソースも見れない?)
* 前提: `ChildPluginForm` は `ParentAppForm` から呼び出されるプラグインのようなもの。
* 前提: `ParentAppForm` はプラグインの親となるアプリケーション
* 前提: `ParentAppForm` は変更できない(ソースも見れない?)
* 前提: `MonitorPluginForm` が現在コードを作成しているオブジェクト
* 前提: `MonitorPluginForm` はコード編集できる
* 前提: `MonitorPluginForm` は `ParentAppForm` から呼び出されるプラグインのようなもの。
* 前提: `ParentAppForm` のインスタンスには `MonitorPluginForm.Parent` でアクセスできる?
* 前提: `ChildPluginForm` のインスタンスには `ParentAppForm` 経由で
`ParentAppForm.OwnedForms` から探せばアクセスできる

ローカルフックで同一プロセスのメッセージを拾えばいけるかも。
デバッグ中に `ChildPluginForm` がWM_ACTIVATEが発行されていないことがあるように思う            **←今ここ**

という状況でしたっけ?

回答書いてる途中で`MonitorPluginForm`の存在思い出したので以下のコードは前提とちょっと違いますが(対象のコードをいじってるので)、関連ありそうなメッセージを拾って判断するしかないでしょうね。

デバッグ中の件は本当に前にでる必要がなくなって、Windowsが`WM_ACTIVATE`を発行していないのかもしれません。ちらっとでもウィンドウが見えるとかタスクバーがハイライトされるのに拾えないなら不思議ですね。
無視した場合でもメッセージは発行されますので、それ以外だと自分より先に処理されて自分まで通達が来ていない場合も考えられますね。


```csharp
namespace ChildPlugin
{
    public partial class ChildPluginForm : Form
    {
        bool seekWM = true;
        StringBuilder sb = new StringBuilder(10240);

        public ChildPluginForm(){
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e){
            seekWM = false;
        }

        protected override void WndProc(ref Message m){
            if (seekWM)
            {
                var msgString = WMsgToString(m.Msg);
                if (msgString == null) msgString = m.Msg.ToString("x9");

                sb.AppendLine(m.HWnd.ToString("X9") + "  " + msgString);
            }

            base.WndProc(ref m);
        }

        private void ChildPluginForm_Paint(object sender, PaintEventArgs e){
            var s = sb.ToString();
            if (s != textBox1.Text)
            {
                textBox1.Text = "";
                textBox1.AppendText(s);
                // textBox1.ScrollToCaret();
            }
        }


        private static string WMsgToString(int msg){
            var msgString = "";
            switch (msg){

                case 32768:
                    msgString = "WM_APP";
                    break;
                case 6:
                    msgString = "WM_ACTIVATE";
                    break;
                case 134:
                    msgString = "WM_NCACTIVATE";
                    break;
                case 28:
                    msgString = "WM_ACTIVATEAPP";
                    break;
                case 3:
                    msgString = "WM_MOVE";
                    break;
                case 534:
                    msgString = "WM_MOVING";
                    break;
                case 130:
                    msgString = "WM_NCDESTROY";
                    break;
                case 1:
                    msgString = "WM_CREATE";
                    break;
                case 129:
                    msgString = "WM_NCCREATE";
                    break;

                case 24:
                    msgString = "WM_SHOWWINDOW";
                    break;

                default:
                    return null;
            }

            return msgString;
       }
}
```

5619
 > たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。
 
 上記の状況が作れなかったので、拾えない状況はわかりませんでした。
-(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
 
 
 ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。  
-(書いている途中で思い出しました)
+(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
+→ (書いている途中で思い出しました)
 
 とりあえずForm1, Form2という名前ではなんだかわからないので `ParentAppForm` と `ChildPluginForm` という名前で説明させてもらいます。
 途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これは`MonitorPluginForm` とさせていただきます。

以下のようなForm ChildPluginForm (Form2と言われていたもの相当)を別プロジェクトのForm ( ParentAppForm )から呼び出してみました。
(面倒だったのでプロジェクト参照してインスタンス作って Show() しているだけですので実際の方式とは違うとは思います。)
実際には winuser.h から WM_xxx引っこ抜いてソースに自動変換したのでWMsgToStringはもっと大量です。

たしかにWM_CREATEとWM_NCCREATEはインスタンス作る時しか出ませんね(当たり前といえば当たり前ですかね。)

WM_ACTIVATEとWM_NCACTIVATEはたしかにShowするたびに発生しているような気がします。

たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。

上記の状況が作れなかったので、拾えない状況はわかりませんでした。

ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。

(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
→ (書いている途中で思い出しました)

とりあえずForm1, Form2という名前ではなんだかわからないので ParentAppFormChildPluginForm という名前で説明させてもらいます。
途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これはMonitorPluginForm とさせていただきます。

  • ゴール: MonitorPluginForm から ChildPluginForm が (ParentAppForm によって) Show ShowDialog されたことを検知したい
    • 今の流れは私がWM_CREATEWM_ACTIVATE あたりを拾えばよいといったので WM_ACTIVATEだが、アクティブになったことを検知したい?
    • WM_SHOWWINDOWは不要?
  • 前提: ChildPluginForm のコードは変更できない(ソースも見れない?)
  • 前提: ChildPluginFormParentAppForm から呼び出されるプラグインのようなもの。
  • 前提: ParentAppForm はプラグインの親となるアプリケーション
  • 前提: ParentAppForm は変更できない(ソースも見れない?)
  • 前提: MonitorPluginForm が現在コードを作成しているオブジェクト
  • 前提: MonitorPluginForm はコード編集できる
  • 前提: MonitorPluginFormParentAppForm から呼び出されるプラグインのようなもの。
  • 前提: ParentAppForm のインスタンスには MonitorPluginForm.Parent でアクセスできる?
  • 前提: ChildPluginForm のインスタンスには ParentAppForm 経由で ParentAppForm.OwnedForms から探せばアクセスできる

ローカルフックで同一プロセスのメッセージを拾えばいけるかも。
デバッグ中に ChildPluginForm がWM_ACTIVATEが発行されていないことがあるように思う ←今ここ

という状況でしたっけ?

回答書いてる途中でMonitorPluginFormの存在思い出したので以下のコードは前提とちょっと違いますが(対象のコードをいじってるので)、関連ありそうなメッセージを拾って判断するしかないでしょうね。

デバッグ中の件は本当に前にでる必要がなくなって、WindowsがWM_ACTIVATEを発行していないのかもしれません。ちらっとでもウィンドウが見えるとかタスクバーがハイライトされるのに拾えないなら不思議ですね。
無視した場合でもメッセージは発行されますので、それ以外だと自分より先に処理されて自分まで通達が来ていない場合も考えられますね。

namespace ChildPlugin
{
    public partial class ChildPluginForm : Form
    {
        bool seekWM = true;
        StringBuilder sb = new StringBuilder(10240);

        public ChildPluginForm(){
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e){
            seekWM = false;
        }

        protected override void WndProc(ref Message m){
            if (seekWM)
            {
                var msgString = WMsgToString(m.Msg);
                if (msgString == null) msgString = m.Msg.ToString("x9");

                sb.AppendLine(m.HWnd.ToString("X9") + "  " + msgString);
            }

            base.WndProc(ref m);
        }

        private void ChildPluginForm_Paint(object sender, PaintEventArgs e){
            var s = sb.ToString();
            if (s != textBox1.Text)
            {
                textBox1.Text = "";
                textBox1.AppendText(s);
                // textBox1.ScrollToCaret();
            }
        }


        private static string WMsgToString(int msg){
            var msgString = "";
            switch (msg){

                case 32768:
                    msgString = "WM_APP";
                    break;
                case 6:
                    msgString = "WM_ACTIVATE";
                    break;
                case 134:
                    msgString = "WM_NCACTIVATE";
                    break;
                case 28:
                    msgString = "WM_ACTIVATEAPP";
                    break;
                case 3:
                    msgString = "WM_MOVE";
                    break;
                case 534:
                    msgString = "WM_MOVING";
                    break;
                case 130:
                    msgString = "WM_NCDESTROY";
                    break;
                case 1:
                    msgString = "WM_CREATE";
                    break;
                case 129:
                    msgString = "WM_NCCREATE";
                    break;

                case 24:
                    msgString = "WM_SHOWWINDOW";
                    break;

                default:
                    return null;
            }

            return msgString;
       }
}
以下のようなForm `ChildPluginForm` (Form2と言われていたもの相当)を別プロジェクトのForm ( `ParentAppForm` )から呼び出してみました。
(面倒だったのでプロジェクト参照してインスタンス作って Show() しているだけですので実際の方式とは違うとは思います。)
実際には winuser.h から WM_xxx引っこ抜いてソースに自動変換したのでWMsgToStringはもっと大量です。


たしかにWM_CREATEとWM_NCCREATEはインスタンス作る時しか出ませんね(当たり前といえば当たり前ですかね。)  
WM_ACTIVATEとWM_NCACTIVATEはたしかにShowするたびに発生しているような気がします。

> たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。

上記の状況が作れなかったので、拾えない状況はわかりませんでした。


ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。  
(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。
→ (書いている途中で思い出しました)

とりあえずForm1, Form2という名前ではなんだかわからないので `ParentAppForm` と `ChildPluginForm` という名前で説明させてもらいます。
途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これは`MonitorPluginForm` とさせていただきます。

* ゴール: `MonitorPluginForm` から `ChildPluginForm` が (`ParentAppForm` によって) `Show` `ShowDialog` されたことを検知したい
  * 今の流れは私が`WM_CREATE`や`WM_ACTIVATE` あたりを拾えばよいといったので WM_ACTIVATEだが、アクティブになったことを検知したい?
  * WM_SHOWWINDOWは不要?
* 前提: `ChildPluginForm` のコードは変更できない(ソースも見れない?)
* 前提: `ChildPluginForm` は `ParentAppForm` から呼び出されるプラグインのようなもの。
* 前提: `ParentAppForm` はプラグインの親となるアプリケーション
* 前提: `ParentAppForm` は変更できない(ソースも見れない?)
* 前提: `MonitorPluginForm` が現在コードを作成しているオブジェクト
* 前提: `MonitorPluginForm` はコード編集できる
* 前提: `MonitorPluginForm` は `ParentAppForm` から呼び出されるプラグインのようなもの。
* 前提: `ParentAppForm` のインスタンスには `MonitorPluginForm.Parent` でアクセスできる?
* 前提: `ChildPluginForm` のインスタンスには `ParentAppForm` 経由で
`ParentAppForm.OwnedForms` から探せばアクセスできる

ローカルフックで同一プロセスのメッセージを拾えばいけるかも。
デバッグ中に `ChildPluginForm` がWM_ACTIVATEが発行されていないことがあるように思う            **←今ここ**

という状況でしたっけ?

回答書いてる途中で`MonitorPluginForm`の存在思い出したので以下のコードは前提とちょっと違いますが(対象のコードをいじってるので)、関連ありそうなメッセージを拾って判断するしかないでしょうね。

デバッグ中の件は本当に前にでる必要がなくなって、Windowsが`WM_ACTIVATE`を発行していないのかもしれません。ちらっとでもウィンドウが見えるとかタスクバーがハイライトされるのに拾えないなら不思議ですね。
無視した場合でもメッセージは発行されますので、それ以外だと自分より先に処理されて自分まで通達が来ていない場合も考えられますね。


```csharp
namespace ChildPlugin
{
    public partial class ChildPluginForm : Form
    {
        bool seekWM = true;
        StringBuilder sb = new StringBuilder(10240);

        public ChildPluginForm(){
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e){
            seekWM = false;
        }

        protected override void WndProc(ref Message m){
            if (seekWM)
            {
                var msgString = WMsgToString(m.Msg);
                if (msgString == null) msgString = m.Msg.ToString("x9");

                sb.AppendLine(m.HWnd.ToString("X9") + "  " + msgString);
            }

            base.WndProc(ref m);
        }

        private void ChildPluginForm_Paint(object sender, PaintEventArgs e){
            var s = sb.ToString();
            if (s != textBox1.Text)
            {
                textBox1.Text = "";
                textBox1.AppendText(s);
                // textBox1.ScrollToCaret();
            }
        }


        private static string WMsgToString(int msg){
            var msgString = "";
            switch (msg){

                case 32768:
                    msgString = "WM_APP";
                    break;
                case 6:
                    msgString = "WM_ACTIVATE";
                    break;
                case 134:
                    msgString = "WM_NCACTIVATE";
                    break;
                case 28:
                    msgString = "WM_ACTIVATEAPP";
                    break;
                case 3:
                    msgString = "WM_MOVE";
                    break;
                case 534:
                    msgString = "WM_MOVING";
                    break;
                case 130:
                    msgString = "WM_NCDESTROY";
                    break;
                case 1:
                    msgString = "WM_CREATE";
                    break;
                case 129:
                    msgString = "WM_NCCREATE";
                    break;

                case 24:
                    msgString = "WM_SHOWWINDOW";
                    break;

                default:
                    return null;
            }

            return msgString;
       }
}
```

回答を投稿

以下のようなForm ChildPluginForm (Form2と言われていたもの相当)を別プロジェクトのForm ( ParentAppForm )から呼び出してみました。
(面倒だったのでプロジェクト参照してインスタンス作って Show() しているだけですので実際の方式とは違うとは思います。)
実際には winuser.h から WM_xxx引っこ抜いてソースに自動変換したのでWMsgToStringはもっと大量です。

たしかにWM_CREATEとWM_NCCREATEはインスタンス作る時しか出ませんね(当たり前といえば当たり前ですかね。)

WM_ACTIVATEとWM_NCACTIVATEはたしかにShowするたびに発生しているような気がします。

たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。

上記の状況が作れなかったので、拾えない状況はわかりませんでした。
(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。

ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。

(書いている途中で思い出しました)

とりあえずForm1, Form2という名前ではなんだかわからないので ParentAppFormChildPluginForm という名前で説明させてもらいます。
途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これはMonitorPluginForm とさせていただきます。

  • ゴール: MonitorPluginForm から ChildPluginForm が (ParentAppForm によって) Show ShowDialog されたことを検知したい
    • 今の流れは私がWM_CREATEWM_ACTIVATE あたりを拾えばよいといったので WM_ACTIVATEだが、アクティブになったことを検知したい?
    • WM_SHOWWINDOWは不要?
  • 前提: ChildPluginForm のコードは変更できない(ソースも見れない?)
  • 前提: ChildPluginFormParentAppForm から呼び出されるプラグインのようなもの。
  • 前提: ParentAppForm はプラグインの親となるアプリケーション
  • 前提: ParentAppForm は変更できない(ソースも見れない?)
  • 前提: MonitorPluginForm が現在コードを作成しているオブジェクト
  • 前提: MonitorPluginForm はコード編集できる
  • 前提: MonitorPluginFormParentAppForm から呼び出されるプラグインのようなもの。
  • 前提: ParentAppForm のインスタンスには MonitorPluginForm.Parent でアクセスできる?
  • 前提: ChildPluginForm のインスタンスには ParentAppForm 経由で ParentAppForm.OwnedForms から探せばアクセスできる

ローカルフックで同一プロセスのメッセージを拾えばいけるかも。
デバッグ中に ChildPluginForm がWM_ACTIVATEが発行されていないことがあるように思う ←今ここ

という状況でしたっけ?

回答書いてる途中でMonitorPluginFormの存在思い出したので以下のコードは前提とちょっと違いますが(対象のコードをいじってるので)、関連ありそうなメッセージを拾って判断するしかないでしょうね。

デバッグ中の件は本当に前にでる必要がなくなって、WindowsがWM_ACTIVATEを発行していないのかもしれません。ちらっとでもウィンドウが見えるとかタスクバーがハイライトされるのに拾えないなら不思議ですね。
無視した場合でもメッセージは発行されますので、それ以外だと自分より先に処理されて自分まで通達が来ていない場合も考えられますね。

namespace ChildPlugin
{
    public partial class ChildPluginForm : Form
    {
        bool seekWM = true;
        StringBuilder sb = new StringBuilder(10240);

        public ChildPluginForm(){
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e){
            seekWM = false;
        }

        protected override void WndProc(ref Message m){
            if (seekWM)
            {
                var msgString = WMsgToString(m.Msg);
                if (msgString == null) msgString = m.Msg.ToString("x9");

                sb.AppendLine(m.HWnd.ToString("X9") + "  " + msgString);
            }

            base.WndProc(ref m);
        }

        private void ChildPluginForm_Paint(object sender, PaintEventArgs e){
            var s = sb.ToString();
            if (s != textBox1.Text)
            {
                textBox1.Text = "";
                textBox1.AppendText(s);
                // textBox1.ScrollToCaret();
            }
        }


        private static string WMsgToString(int msg){
            var msgString = "";
            switch (msg){

                case 32768:
                    msgString = "WM_APP";
                    break;
                case 6:
                    msgString = "WM_ACTIVATE";
                    break;
                case 134:
                    msgString = "WM_NCACTIVATE";
                    break;
                case 28:
                    msgString = "WM_ACTIVATEAPP";
                    break;
                case 3:
                    msgString = "WM_MOVE";
                    break;
                case 534:
                    msgString = "WM_MOVING";
                    break;
                case 130:
                    msgString = "WM_NCDESTROY";
                    break;
                case 1:
                    msgString = "WM_CREATE";
                    break;
                case 129:
                    msgString = "WM_NCCREATE";
                    break;

                case 24:
                    msgString = "WM_SHOWWINDOW";
                    break;

                default:
                    return null;
            }

            return msgString;
       }
}
以下のようなForm `ChildPluginForm` (Form2と言われていたもの相当)を別プロジェクトのForm ( `ParentAppForm` )から呼び出してみました。
(面倒だったのでプロジェクト参照してインスタンス作って Show() しているだけですので実際の方式とは違うとは思います。)
実際には winuser.h から WM_xxx引っこ抜いてソースに自動変換したのでWMsgToStringはもっと大量です。


たしかにWM_CREATEとWM_NCCREATEはインスタンス作る時しか出ませんね(当たり前といえば当たり前ですかね。)  
WM_ACTIVATEとWM_NCACTIVATEはたしかにShowするたびに発生しているような気がします。

> たとえば Visual C# のデバッガー上で動かしていて、Visual C# の IDE のウィンドウが前面に出ていると、拾えなかったです。

上記の状況が作れなかったので、拾えない状況はわかりませんでした。
(具体的には自分でWndProcのオーバーロードではなくローカルフックを進めた理由がわからなくなりました)。


ところで申し訳ないですが現状どこから何をしたいのかわからなくなってしまいました。  
(書いている途中で思い出しました)

とりあえずForm1, Form2という名前ではなんだかわからないので `ParentAppForm` と `ChildPluginForm` という名前で説明させてもらいます。
途中で思い出しましたが、監視するプラグインがいてそれを今実装してるんでしたね。これは`MonitorPluginForm` とさせていただきます。

* ゴール: `MonitorPluginForm` から `ChildPluginForm` が (`ParentAppForm` によって) `Show` `ShowDialog` されたことを検知したい
  * 今の流れは私が`WM_CREATE`や`WM_ACTIVATE` あたりを拾えばよいといったので WM_ACTIVATEだが、アクティブになったことを検知したい?
  * WM_SHOWWINDOWは不要?
* 前提: `ChildPluginForm` のコードは変更できない(ソースも見れない?)
* 前提: `ChildPluginForm` は `ParentAppForm` から呼び出されるプラグインのようなもの。
* 前提: `ParentAppForm` はプラグインの親となるアプリケーション
* 前提: `ParentAppForm` は変更できない(ソースも見れない?)
* 前提: `MonitorPluginForm` が現在コードを作成しているオブジェクト
* 前提: `MonitorPluginForm` はコード編集できる
* 前提: `MonitorPluginForm` は `ParentAppForm` から呼び出されるプラグインのようなもの。
* 前提: `ParentAppForm` のインスタンスには `MonitorPluginForm.Parent` でアクセスできる?
* 前提: `ChildPluginForm` のインスタンスには `ParentAppForm` 経由で
`ParentAppForm.OwnedForms` から探せばアクセスできる

ローカルフックで同一プロセスのメッセージを拾えばいけるかも。
デバッグ中に `ChildPluginForm` がWM_ACTIVATEが発行されていないことがあるように思う            **←今ここ**

という状況でしたっけ?

回答書いてる途中で`MonitorPluginForm`の存在思い出したので以下のコードは前提とちょっと違いますが(対象のコードをいじってるので)、関連ありそうなメッセージを拾って判断するしかないでしょうね。

デバッグ中の件は本当に前にでる必要がなくなって、Windowsが`WM_ACTIVATE`を発行していないのかもしれません。ちらっとでもウィンドウが見えるとかタスクバーがハイライトされるのに拾えないなら不思議ですね。
無視した場合でもメッセージは発行されますので、それ以外だと自分より先に処理されて自分まで通達が来ていない場合も考えられますね。


```csharp
namespace ChildPlugin
{
    public partial class ChildPluginForm : Form
    {
        bool seekWM = true;
        StringBuilder sb = new StringBuilder(10240);

        public ChildPluginForm(){
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e){
            seekWM = false;
        }

        protected override void WndProc(ref Message m){
            if (seekWM)
            {
                var msgString = WMsgToString(m.Msg);
                if (msgString == null) msgString = m.Msg.ToString("x9");

                sb.AppendLine(m.HWnd.ToString("X9") + "  " + msgString);
            }

            base.WndProc(ref m);
        }

        private void ChildPluginForm_Paint(object sender, PaintEventArgs e){
            var s = sb.ToString();
            if (s != textBox1.Text)
            {
                textBox1.Text = "";
                textBox1.AppendText(s);
                // textBox1.ScrollToCaret();
            }
        }


        private static string WMsgToString(int msg){
            var msgString = "";
            switch (msg){

                case 32768:
                    msgString = "WM_APP";
                    break;
                case 6:
                    msgString = "WM_ACTIVATE";
                    break;
                case 134:
                    msgString = "WM_NCACTIVATE";
                    break;
                case 28:
                    msgString = "WM_ACTIVATEAPP";
                    break;
                case 3:
                    msgString = "WM_MOVE";
                    break;
                case 534:
                    msgString = "WM_MOVING";
                    break;
                case 130:
                    msgString = "WM_NCDESTROY";
                    break;
                case 1:
                    msgString = "WM_CREATE";
                    break;
                case 129:
                    msgString = "WM_NCCREATE";
                    break;

                case 24:
                    msgString = "WM_SHOWWINDOW";
                    break;

                default:
                    return null;
            }

            return msgString;
       }
}
```