[转] c# 中 KeyPress 和KeyDown 、KeyPress

别再傻傻分不清了!C# WinForm里KeyPress和KeyDown事件到底怎么选?附实战代码避坑 本文深入解析C# WinForm中KeyPress和KeyDown事件的核心差异与应用场景,帮助开发者避免常见错误。通过实战代码示例,详细展示如何根据输入验证、组合键处理等不同需求智能选择事件类型,提升开发效率与代码质量。特别针对键盘按钮和组合键处理提供了专业解决方案。 阅读详情
Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。

1.按键的类型

  Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和WM_SYSKEYDOWNWindows消息所伴随的值相对应。另外,程序开发人员可通过处理KeyDown或KeyUp 事件来检测大多数物理按键操作。字符键是Keys枚举的子集,它们与WM_CHAR和WM_SYSCHAR Windows消息所伴随的值相对应,如果通过组合按键得到一个字符,则可以通过处理KeyPress事件来检测该字符。

2.键盘事件的顺序

  一个控件上可能出现3个与键盘相关的事件,下面是这些事件发生的常规顺序:

用户按“a”键,该键将被预处理和调度,而且会发生KeyDown事件。 
用户按住“a”键,该键将被预处理和调度,而且会发生KeyPress事件。 
用户松开“a”键,该键将被预处理和调度,而且会发生KeyUp事件。 
3.键的预处理

  像其他消息一样,键盘消息是在窗体或控件的WndProc方法中处理的。窗体或控件在处理键盘消息之前,PreProcessMessage方法会调用一个或多个方法,这些方法可被重写以处理特殊的字符键和物理按键。

/*********************/

键事件按下列顺序发生: 
KeyDown 
KeyPress 
KeyUp 
KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件。 
定义 
KeyDown:在控件有焦点的情况下按下键时发生。 
KeyPress:在控件有焦点的情况下按下键时发生。(下面会说和KeyDown 的区别) 
KeyUp:在控件有焦点的情况下释放键时发生。 
KeyPress 和KeyDown 、KeyPress之间的区别


1、KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符 
2、KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键) 
3、KeyPress 只能捕获单个字符 
4、KeyDown 和KeyUp 可以捕获组合键。 
5、KeyPress 可以捕获单个字符的大小写 
6、KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。 
7、KeyPress 不区分小键盘和主键盘的数字字符。 
8、KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。 
9、其中PrScrn 按键KeyPress、KeyDown和KeyUp 都不能捕获。 
/*******************/

其实我们按下一个键时,KeyDown和KeyPress是都要发生的,而且两个人看上去没有什么区别。但是其实两者还是有实质的区别的。

例如在一个多行文本框里面输入字符,为什么我们没有定义一个键盘响应事件,但是键盘却响应了,把字符输入到了文本框呢?其实我觉得因为这个事件就是系统默认的一个消息响应,它就是KeyPress。如果你自己还给KeyPress定义了自己的响应的话,那么程序会先执行你定义的程序,然后完成系统要求的显示字符事件的响应过程,但是如果你在自己定义KeyPress事件如:private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)里面增加语句:e.Handled=true;那么系统要求的显示字符响应过程就不会被执行,原因就是这个语句的意思就是这个消息响应已经完成。但是如果你在KeyDown,KeyUp里面加这条语句,显示字符串等消息还是会发生,这说明系统的显示字符串和KeyDown,KeyUp是没有关系的,而对于回车和退格消息响应则是由KeyDown控制,增加那条语句则回车换行不会执行,退格响应也不会执行。

综上:要屏蔽键盘上的一个字符的输入,可以在KeyPress里面进行增加语句,而要屏蔽回车和退格则可以在KeyDown里面进行增加语句。

From:http://www.cnblogs.com/poren/articles/1536724.html

--------------------------------------其它资料:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 {
  const int WM_KEYDOWN = 0x100;
  const int WM_SYSKEYDOWN = 0x104;
  if ((msg.Msg == WM_KEYDOWN) ||(msg.Msg == WM_SYSKEYDOWN))
  {
   switch (keyData)
   {
    case Keys.Down:
     this.Parent.Text = "向下键已经被捕捉";
     break;
    case Keys.Up:
     this.Parent.Text = "向上键已经被捕捉";
     break;
    case Keys.Left:
     this.Parent.Text = "向左键已经被捕捉";
     break;
    case Keys.Right:
     this.Parent.Text = "向右键已经被捕捉";
     break;
    case Keys.Home:
     this.Parent.Text = "Home 键已经被捕捉";
     break;
    case Keys.End:
     this.Parent.Text = "End 键已经被捕捉";
     break;
   }
  }
  return base.ProcessCmdKey(ref msg, keyData);
 }
}

补充:要使用e.handled=true 屏蔽输入,对普通键应放在KeyPress事件中,而控制键等应该在KeyDown中。

Zipformer实战:5分钟快速搭建语音识别模型(附LibriSpeech测试结果) 本文提供了一份详细的Zipformer语音识别模型实战指南。通过清晰的步骤,指导读者在5分钟内完成从环境配置、LibriSpeech数据集准备到模型训练与测试的全过程。文章重点解析了关键配置参数,并分享了在LibriSpeech测试集上的性能结果,帮助开发者快速评估和应用这一高效的语音识别架构。 阅读详情

相关推荐

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.youkuaiyun.com/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

C#:KeyPress事件

C#:KeyPress事件KeyChar键值表(常用)实操C#窗体项目——BMI计算器 KeyChar键值表(常用) KeyPress事件过程在截取Textbox或Combox控件输入的击键时,可立即测试击键的有效性或在字符输入时对其进行格式处理。 通常可以在处理限定输入类型时使用。 常用键的ASCII编码 ASCII编码 对应字符 功能 0 NUL 空字符 1 SOH 标题开始 2 STX 正文开始 3 ETX 正文结束 4 EOT 传输结束 5 ENQ 请求 6

liangzixx的博客 1万+

C/C++关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案

这其实不是一种报错,有这个提示的原因是本地端口是被共享的,所以必须关闭一个进程才能执行另一个,只需要对 tasks.json文件做一些修改即可。 报错时候 此时的tasks.json为: { "version": "2.0.0", "command": "g++", "args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.exe"], // 编译命令参数 "problemMatche

Jerry Man的博客 6424

C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)

1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加; 2. 添加KeyPress / KeyDown事件:1、KeyPress 和KeyDown 、KeyPress之间的区别 1)KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert...

wobckr的博客 7963

Mumax3高效模拟技巧:如何利用代码模板快速完成磁性材料特性分析

本文介绍了利用Mumax3代码模板库提升磁性材料微磁学模拟效率的核心方法。通过构建模块化的环境配置、材料库和特征长度计算模板,研究者可以快速组装模拟方案,自动化参数扫描与结果分析,从而将精力聚焦于物理问题本身,实现工作效率的指数级提升。

zz67890的博客 550

win10锁屏或登录时会自动弹出触摸按键的问题解决办法

本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。日期:2023年5月17日作者:任聪聪。

任聪聪的博客 1万+

Keypress,KeyUp,KeyDown

Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。 1.按键的类型   Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按

blackwuxin的专栏 2072

dolphinscheduler-3.4.0

dolphinscheduler集群部署

docsz的博客 660

【c#】键盘事件(keypress keydown keyup)

【前言】       最近小编在学习c#视频的时候遇到了小小的阻力,对于键盘的keydown,keyup,keypress事件不是很理解,有一点小小的强迫症,让我们对他们进行了一段研究,终于有一个进展,但是仅仅代表自己的个人观点啦! 【内容】

知世俗而不世俗 1万+

Nature、science、cell旗下刊物

Nature\science\cell子刊说明

计算机视觉 5605

智能手环嵌入式系统:STM32+ESP8266多传感器健康监护设计

可穿戴健康监测设备是物联网与边缘计算融合的典型应用,其核心在于多源生理信号采集、低功耗实时处理及安全云协同。基于光电容积脉搏波(PPG)的心率与血氧检测、NTC热敏电阻体温测量、加速度-角速度融合跌倒判据等技术,构成了老年健康监护的基础感知能力;而STM32主控与ESP8266协处理器分工架构,则实现了计算资源与通信负载的高效解耦。该方案依托FreeRTOS多任务调度、阿里云IoT物模型标准化交互及MQTT双向通信,兼顾实时性、可靠性和工程可维护性,广泛适用于居家养老、慢病管理与远程健康预警等场景。

weixin_33256096的博客 98

C#winForm键盘事件

以上就是基本的键盘事件的一些需要注意的地方及实例,如果在调试过程中,打断点发现对应的按键不能进入方法中,那么就是对应的方法不支持这个按键。(2).KeyChar属性:用来获取按下的键对应的字符,通常是该键的ASCII玛(返回的是键盘的值,如按‘K‘返回就是K)。(6).KeyData属性:以Keys枚举值返回键盘键的键码,该属性包含修改键信息,用于判断按下键的所有信息(可返回组合键)(5).KeyCode属性:以Keys枚举值返回键盘键的键码,该属性不包含修改键信息,用于测试指定的键盘键。

camellia的博客 3960

【软考】系统集成项目管理工程师(一)信息化知识

软考中级——系统集成项目管理工程师备考干货第一章:信息化知识。

商务合作 | 共同学习 | 携手共进 9万+

C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]

研究了一下KeyDown,KeyPress 和KeyUp ,发现之间还是有点学问的。 让我们带着如下问题来说明,如果你看到这些问题你都知道,那么这篇文章你就当复习吧:) 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的定义 4.KeyDown、KeyUp 和KeyPress 之间的区别 5.如何区分是否按的是小键盘...

demonzsmj12315的博客 178

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[转] C#,WinForm中的KeyDown,KeyPress 和KeyUp事件相关知识点

  Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。 1.按键的类型   Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和WM_SYSKEYDOWNWindows消息所伴随的值相对应。另外,程序开发人员可通过处理KeyDown或KeyUp 事件来检测大多数物理按键操作。字符键是Keys枚举的子集,它们与

Sky的专栏 2031

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

转: C#控件中的KeyDown、KeyPress 与 KeyUp事件

<br />研究了一下KeyDown,KeyPress 和 KeyUp 的学问。让我们带着如下问题来说明: <br />1.这三个事件的顺序是怎么样的?<br />2.KeyDown 触发后,KeyUp是不是一定触发?<br />3.三个事件的定义<br />4.KeyDown、KeyUp 和KeyPress 之间的区别<br />5.如何区分是否按的是小键盘?<br />6.PrScrn按键三个事件能够捕获吗?<br />7.{菜单键}和{开始键}KeyPress能够捕获吗?<br />8.如何捕获系统的

aoxiang1998的专栏 800

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# KeyDown与KeyPress

按键事件的触发顺序: keyDown (控件获取焦点案件发生) KeyPress (控件获取焦点按键发生) KeyUp (控件获取焦点并释放时发生) 那么keyDown和keyPress的区别: KeyDown不能区分字符大小写 KeyPress区分大小写。 他们之间获取键和值的方法也有区别。看例子: namespace KK { public partial clas

theArcticOcean 1194

c# 中 KeyPress 和KeyDown 、KeyUp

Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。 1.按键的类型   Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按

whutcomputer的专栏 1536

C#中Control的KeyDown,KeyPress 和KeyUp事件相关知识点

Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。 1.按键的类型   Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和WM_SYSKEYDOWNWindows消息所伴随的值相对应。另外,程序开发人员可通过处理KeyDown或KeyUp 事件来检测大多数物理按键操作。字符键是Keys枚举的子集,它们与WM_C

一路向东 3033

[C#]C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)

\1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加; \2. 添加KeyPress / KeyDown事件: 1、KeyPress 和KeyDown 、KeyPress之间的区别 1)KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{

德仔 1万+

C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown/KeyUp事件之间的区别

组合键的判断通常在 KeyDown或 KeyUp事件中进行,通过判断修饰键属性(e.Control,e.Shift,e.Alt)和另一个键的 KeyCode来实现。需要注意的是,Print Screen(PrScrn)键无法通过标准的 KeyDown、KeyPress、KeyUp事件捕获。这是一个强大的开源库,它封装了底层API,让你能更轻松地实现模拟键盘输入和全局捕获,非常适合自动化测试、游戏脚本等场景。对于复杂的系统级组合键,有时在 KeyUp事件中判断会更准确,因为它能确保所有键都已完全按下。

日月清心 1182

C# 如何关联键盘按钮 (KeyChar/KeyCode值 KeyPress/KeyDown事件 区别)

1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加; 2. 添加KeyPress / KeyDown事件: KeyPress 和KeyDown 、KeyPress之间的区别:     1).KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、

cc198877的专栏 8529

C#控件中的KeyDown、KeyPress 与 KeyUp使用区别

定义 KeyDown:在控件有焦点的情况下按下键时发生。 KeyPress:在控件有焦点的情况下按下键时发生。(下面会说和KeyDown 的区别) KeyUp:在控件有焦点的情况下释放键时发生。 KeyPress 和KeyDown 、KeyPress之间的区别 1.KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、Scro...

weixin_55546557的博客 1120
上一篇: 关于WM_NCHITTEST消息
下一篇: 发布网站时遇到的两个问题
VCACC
博客等级 码龄17年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值