子类(子窗体)向主窗体发送消息

这里演示的是,在主窗体代码块中,重写拦截信息方法。

首先新建一个类:

这个类名定义为Msg

[DllImport("User32.dll",EntryPoint = "SendMessage")]
private static extern IntPtr SendMessage(int hWnd,int msg,IntPtr wParam,IntPtr IParam);
[DllImport("User32.dll",EntryPoint = "FindWindow")]
//IpClassName表示主窗体的实例名 IpWindowName是主窗体的名字(也就是主窗体的text属性值)
private static extern int FindWindow(string IpClassName,string IpWindowName);
//定义消息变量 这个变量代表这个子类向主窗体发送的“句柄”,通过这个句柄,可以在拦截消息方法中识别是该//类发送给过来的
public const int CUSTOM_MESSAGE = 0X400+2;
//向窗体发送消息的方法
public void SendMsgToMainForm(int msg)
{
    int WINDOW_HANDLER = FindWindow(null,"main_form");

    if(WINDOW_HANDLER == 0)    
    {
        throw new Exception("Could not find Main Window!");
    }
    long result = SendMessage(WINDOW_HANDLER,CUSTOM_MESSAGE,new     
    IntPtr(msg),IntPtr.Zero).ToInt64();
}

在主窗体中重写拦截方法:

//拦截消息方法
protected override void WndProc(ref Message msg)
{
    try
    {
        switch(msg.Msg)
        {
            case Msg.CUSTOM_MESSAGE://处理自定义消息
            //msg.WParam是子类传过来的值
            Messagebox.Show(msg.WParam.ToString());
            break;
            default:
            base.WndProc(ref msg);//调用基类方法处理非自定义消息
            break;
        }
    }
    catch(Exception ex)
    {
        LogHelper.Error("处理拦截信息出错!"+ex.Message,new Exception());
    }
}

之后把这个拦截方法放在主窗体类的构造函数里即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值