在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部分内容可以参考: 点击打开链接

目录
相关文章
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
QT——键盘事件(捕获按键事件)
QT——键盘事件(捕获按键事件)
960 0
重新认识键盘与鼠标——键盘事件与鼠标事件
重新认识键盘与鼠标——键盘事件与鼠标事件
287 0
重新认识键盘与鼠标——键盘事件与鼠标事件
C#(二十八)之C#鼠标事件、键盘事件
鼠标事件分为两种:EventArgs、MouseEventArgs。 键盘事件:KeyEventArgs、KeyPressEventArgs、KeyPress、KeyDown、KeyUp。
475 0
C#(二十八)之C#鼠标事件、键盘事件
|
C#
WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
原文:WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件 在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件。例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开。
2337 0
|
C#
WPF窗体隐藏鼠标光标的方法
原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input;   Mouse.OverrideCursor = Cursors.
1809 0
|
C#
WPF控件获得焦点时去除虚线框
原文:WPF控件获得焦点时去除虚线框
1909 0
|
C#
WPF中类似使用tab键功能,可以向上向下定位
原文:WPF中类似使用tab键功能,可以向上向下定位 private void tbYyrs_KeyUp(object sender, KeyEventArgs e) { UIElement element = Keyboard.
864 0
|
C#
WPF 捕获键盘输入事件
原文:WPF 捕获键盘输入事件 最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号。 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件。 但是这两个事件的对象 KeyEventArgs 不够用,得依靠判断 Key 来判断输入了什么,然后再根据判断写死一个相应键位的 Text 来获取数据。
1846 0