Tip from Andrew Troelsen | Posted by: Duncan Mackenzie, MSDN | Translated by Findekano
说明:文章源自C# FAQ,翻译此文仅为个人爱好,如有错误敬请指点
说明:文章源自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;
}
}
{
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);
}
…
}
{
private MyMessageFilter msgFliter = new MyMessageFilter();
public mainForm()
{
// Register message filter.
Application.AddMessageFilter(msgFliter);
}
…
}
此时,消息在送往注册的event处理器之前将被你定制的Message Filter预先处理。可以通过Application.RemoveMessageFilter() 来删除原来注册的Message Filter。