很现实得例子,现在有一个登录窗口,需求:按下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);
不然未来得某个时刻可能会出现其他异常错误。
这篇博客探讨了在C#中如何处理登录窗口的Enter键事件,以实现按下Enter键等同于点击登录按钮的功能。作者尝试了重写WndProc方法和使用KeyDown、KeyPress、KeyUp事件,但未能成功。最终,通过实现IMessageFilter接口的PreFilterMessage方法,成功拦截键盘消息,确保Enter键能触发登录操作。文章提醒在使用完成后记得移除消息过滤器,以避免潜在异常。

708

被折叠的 条评论
为什么被折叠?



