在winform中捕获上下左右键等控制键的按键事件

简介: 最近一直在做表单设计器,今天有一个需求就是:通过上下左右键来控制表单上的控件移动。但是控件的KeyDown捕获不到上下左右键,KeyUp事件倒是可以捕获到,但你通过上下左右键移动控件位置,不能点一下才移动一下啊,太不人性了。上网找了半天发现了这么一个方法: 重写Control的ProcessDialogKey方法,此处以winform表单为例:protected override boo
最近一直在做表单设计器,今天有一个需求就是:通过上下左右键来控制表单上的控件移动。
但是控件的KeyDown捕获不到上下左右键,KeyUp事件倒是可以捕获到,但你通过上下左右键移动控件位置,不能点一下才移动一下啊,太不人性了。上网找了半天发现了这么一个方法:

重写Control的ProcessDialogKey方法,此处以winform表单为例:

protected override bool ProcessDialogKey(Keys keyData)
        {
            Control control = this.GetFocusedControl();
            this.MoveControlByKeys(keyData, control);
            return base.ProcessDialogKey(keyData);
        }
        /// <summary>
        /// 根据keyData的值移动控件control
        /// </summary>
        /// <param name="keyData"></param>
        /// <param name="control"></param>
        private void MoveControlByKeys(Keys keyData, Control control)
        {
            if (keyData == Keys.Left)
            {
                if (control.Location.X > 0)
                {
                    control.Location = new Point(control.Location.X - 1, control.Location.Y);
                }
            }
            else if (keyData == Keys.Right)
            {
                control.Location = new Point(control.Location.X + 1, control.Location.Y);
            }
            else if (keyData == Keys.Up)
            {
                if (control.Location.Y > 0)
                {
                    control.Location = new Point(control.Location.X, control.Location.Y - 1);
                }
            }
            else if (keyData == Keys.Down)
            {
                control.Location = new Point(control.Location.X, control.Location.Y + 1);
            }
        }

        //API声明:获取当前焦点控件句柄    
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
        internal static extern IntPtr GetFocus();
        ///获取 当前拥有焦点的控件
        private Control GetFocusedControl()
        {
            Control focusedControl = null;
            // To get hold of the focused control:
            IntPtr focusedHandle = GetFocus();
            if (focusedHandle != IntPtr.Zero)
                //focusedControl = Control.FromHandle(focusedHandle);
                focusedControl = Control.FromChildHandle(focusedHandle);
            return focusedControl;
        }
在表单设计器中这个方法不起作用,不清楚为什么
于是还要寻找新的解决方案,但是发现了PreviewKeyDown事件,在表单设计器中,它可以获取到上下左右键,问题解决。

关于PreviewKeyDown部分内容可以参考: 点击打开链接

目录
相关文章
|
9月前
键盘绑定按下事件
键盘绑定按下事件
30 0
QT——键盘事件(捕获按键事件)
QT——键盘事件(捕获按键事件)
850 0
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
|
Windows
Windows程序设计——窗口键盘消息滚动事件
Windows程序设计——窗口键盘消息滚动事件
240 0
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
|
C#
WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
原文:WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件 在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件。例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开。
2249 0
|
C# Windows
WPF无边框捕获消息改变窗口大小
原文:WPF无边框捕获消息改变窗口大小 文章大部分转载自http://blog.csdn.net/fwj380891124,如有问题,请联系删除  最近一直在学习 WPF,看着别人做的WPF程序那么漂亮,眼红啊~ 很多漂亮的程序都是无边框的。
1176 0
|
C# Windows
WPF 窗体中获取键盘和鼠标无操作时的超时提示
原文:WPF 窗体中获取键盘和鼠标无操作时的超时提示 通过调用Windows API中的GetLastInputInfo来获取最后一次输入的时间 using System;using System.
867 0
|
C#
WPF窗体隐藏鼠标光标的方法
原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input;   Mouse.OverrideCursor = Cursors.
1600 0