Tirion

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
Tip from Andrew Troelsen | Posted by: Duncan Mackenzie, MSDN | Translated by Findekano
说明:文章源自C# FAQ,翻译此文仅为个人爱好,如有错误敬请指点

在非托管世界,截取Win32消息进行处理得情况非常常见,Win32消息被用户应用程序截取就如同在消息队列中被弹出一般。然而在托管WIndows Form应用程序中很少碰到这种情况。Anyway,你可以通过如下步骤来截取并处理Windows消息。
首先,建立一个实现IMessageFilter接口的辅助类,可以通过它唯一的方法PreFilterMessage()来得到原始的WPARAM 和LPARAM 数据,即实际的message ID。下面是一个简单示例:

public class MyMessageFilter : IMessageFilter 
{
  
public bool PreFilterMessage(ref Message m) 
  
{
    
// Intercept the left mouse button down message.
    if (m.Msg == 513
    
{
      MessageBox.Show(
"WM_LBUTTONDOWN is: " + m.Msg);
      
return true;
    }

    
return false;
  }

}


在主程序中用Application类型注册该辅助类:

public class mainForm : System.Windows.Forms.Form
{
  
private MyMessageFilter msgFliter = new MyMessageFilter();

  
public mainForm()
  
{
    
// Register message filter.
    Application.AddMessageFilter(msgFliter);        
  }


}


此时,消息在送往注册的event处理器之前将被你定制的Message Filter预先处理。可以通过Application.RemoveMessageFilter() 来删除原来注册的Message Filter。

posted on 2004-11-08 11:21  Findekano  阅读(1341)  评论(0编辑  收藏  举报