C#中如何定义和接收消息?

C#中如何定义和接收消息?


作者: Wason  &;nbsp来自:网络


                业余学习成果: 终于把自定义消息给搞定,好事多多分享!
 
      在C#中目前我还没有找到发送消息的类成员函数,所以只能采用通过调用WIN 32 API 的 SendMessage() 函数实现。由于 SendMessage的参数中需要得到窗体的句柄(handler) ,所以又要调用另一个API FindWindow(), 两者配合使用,达到在不同窗体之间的消息发送和接收功能。
 
      另外一个要点是,需要通过重写(Override) 窗体的 DefWndProc() 过程来接收自定义的消息。DefWndProc 的重写:
 
      protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch(m.Msg)
            {
                  case ...:
                      break;
                  default:
                      base.DefWndProc(ref m);
                      break;
            }
      }
 
 
  下面是我的C#实践例程。
  ------------------------------------
  /////////////////////////////////////////
  ///file name: Note.cs
  ///
  public class Note
  {
        //声明 API 函数
 
        [DllImport("User32.dll",EntryPoint="SendMessage")]
        private static extern int SendMessage(
                    int hWnd,      // handle to destination window
                    int Msg,      // message
                    int wParam,  // first message parameter
                    int lParam // second message parameter
        );
        [DllImport("User32.dll",EntryPoint="FindWindow")]
        private static extern int FindWindow(string lpClassName,string
  lpWindowName);
        //定义消息常数
        public const int USER = 0x500;
        public const int TEST  = USER  1;
 
 
      //向窗体发送消息的函数
 
        private void SendMsgToMainForm(int MSG)
        {
            int WINDOW_HANDLER = FindWindow(null,@"Note Pad");
            if(WINDOW_HANDLER == 0)
            {
                  throw new Exception("Could not find Main window!");
            }
            SendMessage(WINDOW_HANDLER,MSG,100,200);
      }
  }
 
 
  /////////////////////////////////////////
  /// File name : Form1.cs
  /// 接收消息的窗体
  ///
 
  public class Form1 :  System.Windows.Forms.Form
  {
        public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
            }
      /// 重写窗体的消息处理函数
      protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch(m.Msg)
            {
                  //接收自定义消息 USER,并显示其参数
                  case Note.USER:
                      string message = string.Format ("Received message!
  parameters are :{0},{1}",m.WParam ,m.LParam);
                      MessageBox.Show (message);
                      break;
                  default:
                      base.DefWndProc(ref m);
                      break;
            }
            //Console.WriteLine(m.LParam);
  }
 
  --
 
  Wilson Wei
 
    (2005-10-04:03:48)
 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 警告:持续变种木马正在发起农历新年攻势!
 您可能对 [C#] 的这些文章也感兴趣:
论C#变得越来越臃肿是不可避免的
查询IP所在区段(C#)
在C#中利用SharpZipLib进行文件的压缩和解压缩
C# - Append a host header by code in IIS
在C#中调用Microsoft.VisualBasic命名空间下的类型验证函数
使用泛型实现单例提供者(原创翻译)
C#2 anonymous methods
Master Pages: Tips, Tricks, and Traps
Microsoft .NET 框架资源基础
基于.Net平台应用程序唯一运行实例实现
.net Framework 2.0 专门提供了配置文件的操作
正确实现 IDisposable