0

プロジェクトのすべてのフォームにイベント ハンドラを追加したいと考えています。各フォームLoad eventが起動されると、Form_Load() で記述されたコードのほかに、イベント ハンドラも実行されます。

これは私のコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;

namespace eventHandlerIntercept {    
   static class Program    {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {

          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          //intercept all form's Load event
          Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
          foreach (Assembly a in assemblies)
          {
              Type[] types = a.GetTypes();
              foreach (Type t in types)
              {
                  if (t.IsPublic && t.BaseType == typeof(Form))
                  {
                      if (t.Namespace.Contains("eventHandlerIntercept"))    
                      {                        
                        EventInfo e1 = t.GetEvent("Load");

                        MethodInfo mi = typeof(Program).GetMethod("HandleCustomEvent");

                        Delegate handler = Delegate.CreateDelegate(e1.EventHandlerType, mi);

                        object o1 = Activator.CreateInstance(t);
                        e1.AddEventHandler(o1, handler);

                    }
                }
            }
         }
         Application.Run(new Form1());
    }


    public static void HandleCustomEvent(object sender, EventArgs a)
    {
        // Do something useful here.
        MessageBox.Show("xyz");
    }
  }
 }

message boxこのコードはエラーなしでコンパイルされますが、Form1 が表示されると、コンテンツが表示されませんxyz。コードの問題はどこにありますか?

4

2 に答える 2

1

型で何かをしようとして「すべてのフォームの Load イベントをインターセプト」する方法はありません。OnLoad イベントはインスタンス イベントであるため、派生オブジェクトのインスタンスが作成される前にハンドラーを追加する方法はありません。Form

コードは実際にはすべての From 派生クラスのインスタンスを作成し、リスナーを追加しますが、結果のオブジェクトを完全に無視して、 への呼び出し用に新しいオブジェクトを作成しますRun。そのアプローチを機能させるには、o1対応するForm1型をRunメソッドに渡す必要があります。

タイプ名でフォームを作成し、すぐにハンドラーをアタッチする、ある種のファクトリ メソッドを記述したい場合があります。また、新しいフォームを作成する必要がある場合はいつでもこのメソッドを使用できます (コンストラクターを直接呼び出す代わりに)。

于 2013-03-08T06:04:37.297 に答える
1

これを試すことができます:

Form myForm = new Form();
myForm.Load += HandleCustomEvent;
Application.Run(myForm);

それは私にとってはMessageBoxうまくいきましたが、フォーム自体の前に表示されます。それがあなたにとって重要かどうかはわかりません。それでも、これがお役に立てば幸いです。フィードバックをお願いします。

于 2013-03-08T06:24:58.700 に答える