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

最近一直在做表单设计器,今天有一个需求就是:通过上下左右键来控制表单上的控件移动。
但是控件的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部分内容可以参考:点击打开链接

时间: 2024-10-29 22:01:38

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

在C# winform中如何获取 datagrid的checkbox列的选中事件

问题描述 在C#winform中如何获取datagrid的checkbox列的选中事件.先谢谢了! 解决方案 解决方案二:如果使用DataGridView,俺的方法是捕获CellContentClick事件解决方案三:能否说的再详细一点吗?谢谢了

C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp区别与联系

1.键事件按下列顺序发生: PreviewKeyDown        KeyDown        KeyPress        KeyUp2.KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件.3.定义 PreviewKeyDown:在焦点位于此控件上的情况下,当有按键动作时发生(在 KeyDown 事件之前发生). 小注: 某些按键,比如 Tab.Return.Esc 和箭头键,通常会被某些控件忽略,因为它们没有被视为输入按键.

文本框-c# winform中如何控制焦点。新人求教。

问题描述 c# winform中如何控制焦点.新人求教. 如何实现光标在文本框的,数据库的表格在按上下键时可以移动.就是下面这种情况. 解决方案 private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Down) { this.dataGridView1.Rows[this.dataGridView1.CurrentRow.Index + 1 > this.dataGridView1

在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如何捕捉全局的异常.基本上在winform或web中捕获全局异常的思路都是一样的,在全局的应用程序对象中添加异常捕获的代码,并写入日志文件中. 一.在Winform程序中捕获全局异常 在winfrom中我们需要了解Application对象中的两个事件 ①Application.ThreadExcep

c#winform中的云台控制的设计以及他的按钮设计

问题描述 c#winform中的云台控制的设计以及他的按钮设计 c#winform中设计云台控制,所谓的PTZ,按钮的设置,重点是不规则按钮(如,弧形按钮及圆形按钮),要求:中间一个圆形按钮,它的四方由弧形按钮包围

如何在C#的WinForm中制作饼状图和柱状图

饼状图|柱状图 当我们的软件需要各种饼状图和柱状图来表示数据时,我们或许会想到用Offices中的图形控件或是第三方控件,但现在的第三方控件大都需要注册,有些免费的控件会有开发商的标记等.而对于使用Offices的图形控件来说,并不能在程序中得于很好控制,其使用的简易程度也较低,所以在这我给出在C#中使用GDI+实现饼状图和柱状图跟数据库联接显示数据的方法.  using System;  using System.IO;//用于文件存取  using System.Data;//用于数据访问 

Delphi中在DLL中封装的VCL窗体Tab键响应的问题

在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Tab按键并向活动子窗体发送一个Tab键按下的消息 2. 子窗体手动定义一个Tab键被按下的处理(需要用到FormKeyDown事件). 3. 移动到下一个焦点的WinAPI函数:Perform(WM_NEXTDLGCTL,0,0); 4.移动到上一个焦点的函数:Perform(WM_NEXTDLGCT

Perl中捕获警告信息、异常信息并写入日志详解

  这篇文章主要介绍了Perl中捕获警告信息.异常信息并写入日志详解,本文分别给出了捕获警告--不处理.捕获警告--并转换成异常.捕获警告--并写入日志.捕获并写日志的完整例子等实用实例,需要的朋友可以参考下 虽然建议在每个Perl脚本和模块中开启警告,可是你又不想用户看到Perl发出的警告. 一方面你想在代码前面使用use warnings作为你的安全网,另一方面,通常警告会出现在屏幕上.多数情况下,客户不知道如何处理这些警告.如果幸运的话这些警告仅仅让客户惊讶一下,当然,不幸的是他们尝试着去

treeview和xml-C# winform中treeView我想新增一个节点,同时这个节点对应的新增一个对象

问题描述 C# winform中treeView我想新增一个节点,同时这个节点对应的新增一个对象 C# winform treeView,2级,第一级是控制卡,控制卡的参数是IP,右边的tabpage可以对参数赋值,第二级是控制卡下面是素材,素材也有几个参数的,tabpage也可以对参数赋值,我想怎么新增一个节点的同时新增一个对象,比如新增控制卡1的节点,就新增一个控制卡1的对象,然后控制卡1的对象下面可以增加素材,我的想法是用一个list,但是不知道类怎么定义,有大牛吗?当然了定义之后可以写在