C# Winform 来监听键盘上的操作

很现实得例子,现在有一个登录窗口,需求:按下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);

不然未来得某个时刻可能会出现其他异常错误。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值