关于c#中的消息处理函数和vc中的消息处理函数区别

原创 2004年06月25日 15:14:00

 从vc入门编程的,相信大家都很熟悉PreTranslateMessage和WindowProc两个函数,前者是预处理windows发给控件的消息,后者是处理剩余的控件消息。对于PreTranslateMessage函数,一般来说,我们是这样处理控件消息的:


BOOL test::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->hwnd==GetSafeHwnd())
{

if(pMsg->message==WM_MOUSEMOVE)
{m_tooltip.RelayEvent(pMsg);}
}
 return CDialog::PreTranslateMessage(pMsg);
}
}

分为两层,先判断该消息是属于那个控件窗口的,再判断这个消息的类型。

对于windowproc函数,我们通常是这样处理控件消息的:
LRESULT test::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_SYSCOMMAND)
if(wParam==SC_RESTORE)
wParam=SC_MAXIMIZE;

 return CDialog::WindowProc(message, wParam, lParam);
}
这个函数对控件消息的处理方法是先把消息发给当前控件,如果不处理,则发给其父窗口,如果其父窗口也不处理,则发给当前程序处理。

而在c#中,消息处理函数有所改变。对于PreProcessMessage函数:
我们必须在需要预处理消息的控件中重载这个函数,而不能仅在父窗口重载这个函数。
  public override bool PreProcessMessage(ref Message msg)
  { 
  
   if(msg.Msg==0x101)
   {
  
   
    MessageBox.Show(msg.HWnd.ToString());
   }
   

   return base.PreProcessMessage(ref msg);
  
  }
可以看到,此函数第一步不再需要判断此消息是属于那个控件的,每个控件(包括父窗口本身),它只处理属于自己的消息,不再沿用vc中的消息机制,在某个消息发送到一个类前,允许其它类试着处理它。

 对于WndProc(跟vc中的windowproc名字稍有改变)函数来说:


 protected override void WndProc(ref Message msg)
        {
          
   if(msg.Msg==0x101)
   {
  
   
    MessageBox.Show(msg.HWnd.ToString());
   }
   
            base.WndProc(ref msg);
        }

和vc中的windowproc没有什么形式上的变化,只不过实质上,c#已不再采用消息发送顺序的机制,只要当前控件没有相应消息处理入口,则消息被丢弃。


   如果我们在c#里面想再实现在listbox控件中,点右键弹出菜单,就不能再用
BOOL test::PreTranslateMessage(MSG* pMsg)
{
 if(pMsg->hwnd==GetDlgItem(IDC_listbox1)->GetSafeHwnd())
 {
switch(pMsg->message)
 {

  case WM_LBUTTONUP:
……

  }
 } 
}
呵呵,那怎么办呢,^_^
其实c#中,不再和vc那样只提供少数几种事件,c#中丰富的事件,已经不再经常需要程序员特制某种事件的消息处理函数,只要在listbox控件的mousedown响应函数中,区分出左右键,然后根据情况弹出不同的菜单即可!

    但比如你要自定义一个编辑框,可是想拦截某些特定的键(如delete),这时,c#丰富的事件,就不再有用了,必须要我们先自定义一个从textbox继承下来编辑框控件,然后在其preprocessmessage函数中预处理它!

public override bool PreProcessMessage(ref Message msg)
  { 
  Keys keyCode=(Keys)(int)msg.WParam &Keys.KeyCode;
   if(msg.Msg==0x101&&keyCode==Keys.Delete)
   {
  
  ……
   }
   

   return base.PreProcessMessage(ref msg);
  
  }

剩余几点,我现在还没搞清楚:
PreProcessMessage函数能处理的消息很有限:
WM_KEYUP,WM_KEYDOWN之类的消息可以处理,可是WM_CLOSE,WM_LBUTTONDOWN等消息无法处理。但wndproc函数却可以处理它们! 不知道是微软故意屏蔽掉那些消息的预处理,还是有什么其它的蹊跷!

从GetSafeHwnd()和GetSafeHandle()分析句柄和指针

GetSafeHwnd()和GetSafeHandle()的主要区别: 1.使用者不同: (1)窗体使用: GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以...
  • ghevinn
  • ghevinn
  • 2014年03月18日 10:29
  • 2652

走进windows编程的世界-----消息处理函数(2)

一 WM_PAINT消息 1 WM_PAINT的产生   由于窗口的互相覆盖等,产生需要绘制的区域,那么会产生WM_PAINT消息.   一般情况下,不直接发送WM_PAINT消息,通过API声明需要...
  • jsh13417
  • jsh13417
  • 2014年07月06日 17:40
  • 2380

消息处理函数的转移

//========================================================================//TITLE://    消息处理函数的转移//A...
  • norains
  • norains
  • 2008年01月03日 22:30
  • 5313

自定义消息响应函数

手动添加消息和消息处理函数 1、由于是用户自己定义的消息,所以首先要定义一个消息宏如下: #define WM_MYMESSAGE (WM_USER+1) 注意:为防止用户定义的宏和系统定义宏冲...
  • foreverhuylee
  • foreverhuylee
  • 2014年05月09日 15:05
  • 4576

VC++中的通知消息

编辑框在发生某些事件的时候会向父窗口发送通知消息,我们可以为编辑框添加消息处理函数,现在我们看看编辑框部分消息通知函数:        EN_CHANGE:编辑框的内容被用户改变了,与EN_UPDA...
  • datouniao1
  • datouniao1
  • 2015年12月08日 22:29
  • 215

VC/MFC中常用消息总结(常见的窗口消息)

CButton::Create BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd...
  • youfulan
  • youfulan
  • 2014年07月22日 17:17
  • 449

MFC的消息处理函数

转自:http://blog.163.com/chen_xinghuan/blog/static/172201582201151192943481/1.AfxWndProc() 该函数负责接收消息...
  • majinlei121
  • majinlei121
  • 2015年05月21日 08:36
  • 1678

MFC的消息处理函数

1.AfxWndProc()       该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()   该函数负责保存消息(保存的内...
  • zyzhangyue
  • zyzhangyue
  • 2015年05月17日 13:38
  • 547

VC 向其他进程窗口发送自定义消息

发送端:
  • w839687571
  • w839687571
  • 2014年07月08日 12:34
  • 2812

VC进程间通信之消息传递PostMessge()或SendMessage()

SendMessage, PostMessage实现进程通讯 项目1中发送消息: #define WM_MYMESSAGE WM_USER + 1 CWnd *pWnd = CWnd::Fi...
  • jiangqin115
  • jiangqin115
  • 2015年07月20日 16:19
  • 4550
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于c#中的消息处理函数和vc中的消息处理函数区别
举报原因:
原因补充:

(最多只允许输入30个字)