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);

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

你可能感兴趣的:(IT,其他)