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

作者: Wason www.ASPCool.com 时间:2001-9-28 18:31:29 阅读次数:2420

业余学习成果: 终于把自定义消息给搞定,好事多多分享!

在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#实践例程。

///////////////////////////////////////// 
using System.Runtime.InteropServices;
///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

Contributors: FHL