很现实得例子,现在有一个登录窗口,需求:按下Enter键,执行和点击"登录"按钮一样得操作:
Form对象有几个事件和一个函数可能导致我们进入误区:
首先讲讲:WndProc(ref Message m) 从写它,自己来处理消息;
protected
override
void
WndProc(
ref
Message m)
{
const
int
WM_KEYDOWN = 0x0112;
const
int
SC_ENTER = 0xD;
if
(m.Msg == WM_KEYDOWN && (int) m.WParam == SC_ENTER)
{
// 屏蔽传入的消息事件
this
.WindowState = FormWindowState.Minimized;
return
;
}
base
.WndProc(
ref
m);
}
很遗憾,上面得方法,如有TextBox存在,你会非常失望;WM_KEYDOWN
类型得消息来不了,
当然还有几个事件:KeyDown KeyPress KeyUp
我都一一试过了还是不行,下面进去实现得正式方法;
首先定义一个类并实现接口 PreFilterMessage:
MessageFilter : IMessageFilter
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == 0x0100)
{
CallBackInfo(m);
}
return false;
}
为了不影响案件得其他作用,这便返回False;
可以看看返回True是什么意思,就可以做一套阻断消息得功能了
CallBackInfo这里我采用得是一个私有委托,在MessageFilter得构造函数中赋值。
CallBackInfo调用得函数里面就可以去处理消息了,判断消息得类型处理就好。
把new 一个MessageFilter对象,然后Application.AddMessageFilter(MessageFilter.ObjMessageFilter);
当然特别注意:在你用完成了,即时Application.RemoveMessageFilter(MessageFilter.ObjMessageFilter);
不然未来得某个时刻可能会出现其他异常错误。