C# KeyDown事件

当需要持续、切换点击鼠标时,鼠标结合键盘的操作效率会更高,因此记录下窗体KeyDown和KeyUp时遇到的一些小问题

1、窗体的KeyPreview属性需要设置为true

2、将keyPreview值设置成true后按功能键和数字键都没有问题,但是按方向键任然没有触发KeyDown事件?

      解决:覆盖默认的系统键处理方式,遇到方向键,则直接返回,系统不处理,这样键值就会被传递到窗体,触发KeyDown事件。

        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Up || keyData == Keys.Down ||
                keyData == Keys.Left || keyData == Keys.Right)
                return false;
            else
                return base.ProcessDialogKey(keyData);
        }

3、当按下空格键时,会把窗体中获取焦点的控件(比如按钮,文本框等)的单击事件触发,需要屏蔽这个现象

            if (e.KeyCode == Keys.Space)
            {

                e.Handled = true;//表示已经处理了键盘消息
            }

窗体事件:

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
            {
                #region 窗体相关操作
                if (dicQQDJ.ContainsKey(currentPic))
                    pictureDJ.Image = (Image)dicQQDJ[currentPic];
                #endregion
                e.Handled = true;//表示已经处理了键盘消息,屏蔽其他控件时间
            }
            else if (e.KeyCode == Keys.Left)
            {
                btnUp_Click(null, null);
            }
            else if (e.KeyCode == Keys.Right)
            {
                btnDown_Click(null, null);
            }
        }
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
            {
                #region 窗体相关操作
                if (dicQQDJ.ContainsKey(currentPic))
                    pictureDJ.Image = (Image)dicHQDJ[currentPic];
                #endregion
                e.Handled = true;//表示已经处理了键盘消息,屏蔽其他控件时间
            }
        }

Reference:

WinForm中屏蔽空格键对按钮的作用

C#窗体无法接受Keydown事件

### C# WinForms 中处理 KeyDown 事件C# 的 Windows Forms 应用程序中,`KeyDown` 事件用于检测键盘按键操作。当特定键被按下时触发此事件。为了捕获并响应这些按键事件,在窗体或控件上订阅 `KeyDown` 事件,并实现相应的事件处理器。 下面是一个简单的例子来展示如何设置和使用 `KeyDown` 事件: ```csharp public partial class MainForm : Form { public MainForm() { InitializeComponent(); // 订阅 KeyDown 事件 this.KeyDown += new KeyEventHandler(MainForm_KeyDown); // 启用按键预览功能以便即使焦点不在当前窗口也能捕捉到按键消息 this.KeyPreview = true; } private void MainForm_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.C) // 检查是否按下了Ctrl+C组合键 { MessageBox.Show("Copy command detected!"); } else if(e.Alt && e.KeyCode == Keys.F4) // 检测Alt+F4关闭应用程序命令 { Application.Exit(); } Console.WriteLine($"Key pressed: {e.KeyCode}"); } } ``` 在这个实例里,通过重写构造函数中的初始化部分,订阅了表单级别的 `KeyDown` 事件[^1]。每当有按键动作发生时就会调用指定的方法 (`MainForm_KeyDown`) 来执行自定义逻辑。此外还启用了全局性的按键监听(`this.KeyPreview=true;`)使得即便其他子组件拥有输入焦点也可以接收到按键通知。 值得注意的是,对于某些特殊用途可能还需要考虑使用更底层的方式获取按键状态,比如利用Windows API 函数如 `GetAsyncKeyState()` 可以获得更加精确的控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值