• C# 中消息处理


    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://cjbskysea.blogbus.com/logs/36323046.html

     对于处理所有消息.net 提供了wndproc进行重写

    WndProc(ref Message m)
    protected override void WndProc(ref Message m)
    {

        const int WM_SYSCOMMAND = 0x0112;
       

        const int SC_CLOSE = 0xF060;
        

       if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
        {
            // 屏蔽传入的消息事件
            this.WindowState = FormWindowState.Minimized;
            return;
         }
        base.WndProc(ref m);

     

     

     

    C#中如何编写使用SendMessage

         在.net中,程序驱动采用了事件驱动而不是原来的消息驱动,
    虽然.net框架提供的事件已经十分丰富,但是在以前的系统中定义了
    丰富的消息对系统的编程提供了方便的实现方法,因此在.net中使用消
    息有时候可以提高编程的效率的。

     1 定义消息

    在c#中消息需要定义成windows系统中的原始的16进制数字,比如

    const int WM_Lbutton = 0x201;  //定义了鼠标的左键点击消息

    public const int USER = 0x0400; // 是windows系统定义的用户消息


    2 消息发送


    消息发送是通过windows提供的API函数SendMessage来实现的它的原型定义为
     

     [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

    );

     3 消息的接受  

     在.net中,任何一个窗口都有消息的接收处理函数,就是wndproc函数

     你可以在form中重写该函数来处理消息

     protected override void WndProc ( ref System.WinForms.Message m )

    {

    switch(m.msg)

    {

    case WM_Lbutton :

     string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);

     MessageBox.Show(message);

     break;

    default:

     base.DefWndProc(ref m);//调用基类函数处理非自定义消息。

     break;

    }

    }

    其实,C#中的事件也是通过封装系统消息来实现的,如果你在WndProc函数中不处理该消息

    那么,它会被交给系统来处理该消息,系统便会通过代理来实现鼠标单击的处理函数,因此你可以通过

    WndProc函数来拦截消息,比如你想拦截某个按钮的单击消息

     

    4 C#中其他的消息处理方法

      在C#中有的时候需要对控件的消息进行预处理,比如你用owc的spreedsheet控件来处理

    Excel文件,你不想让用户可以随便选中数据进行编辑,你就可以屏蔽掉鼠标事件,这个时

    候就必须拦截系统预先定义好的事件(这在MFC中称为子类化),你可以通过C#提供的一个

    接口

    IMessageFilter来实现消息的过滤

    public class Form1: System..Forms.Form,IMessageFilter

    {

     const int WM_MOUSEMOVE = 0x200;

     public bool PreFilterMessage(ref Message m)  //实现接口

     { 

            Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; 

       if( m.Msg==WM_MOUSEMOVE)        //或m.Msg == WM_LBUTTONDOWN

       {

        MessageBox.Show("Ignoring Escape...");  

        return true; 

       } 

        return false; 

     }

    }

    //.net 提供了ProcessCmdKey 重新实现Form的键盘消息
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)        

     {
                int WM_KEYDOWN = 256;
                int WM_SYSKEYDOWN = 260;

                if (msg.Msg == WM_KEYDOWN | msg.Msg == WM_SYSKEYDOWN)
                {
                    switch (keyData)
                    {
                        case Keys.Escape:
                            this.Close();//Esc退出                    

                          break;
                    }

                }
                return false;
      }



    返回导读目录,阅读更多随笔



    分割线,以下为博客签名:

    软件臭虫情未了
    • 编码一分钟
    • 测试十年功


    随笔如有错误或不恰当之处、为希望不误导他人,望大侠们给予批评指正。

  • 相关阅读:
    20180925-5代码规范
    20180925-4 单元测试,结对
    20180925-6 四则运算试题生成
    20180925-3 效能分析
    20170925-2 功能测试
    20180925-7 规格说明书——吉林市两日游
    20180918-1 词频统计
    第二周例行报告
    iOS开发-CocoaPods使用详细说明
    svn的使用详解
  • 原文地址:https://www.cnblogs.com/08shiyan/p/1980374.html
Copyright © 2020-2023  润新知