[C# FAQ]通过Windows Forms预处理Win32消息

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。下面是一个简单示例:

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

InBlock.gif    
return false;
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}


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

None.gif public   class  mainForm : System.Windows.Forms.Form
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
private MyMessageFilter msgFliter = new MyMessageFilter();
InBlock.gif
InBlock.gif  
public mainForm()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
// Register message filter.
InBlock.gif
    Application.AddMessageFilter(msgFliter);        
ExpandedSubBlockEnd.gif  }

InBlock.gif
ExpandedBlockEnd.gif}


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

转载于:https://www.cnblogs.com/Findekano/archive/2004/11/08/61406.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值