Keypress,KeyUp,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中。


<think>好的,我现在需要解释用户提到的这些JavaScript事件:queryLoad、postLoad、load、click、dblclick、keydownkeypresskeyup、mousedown、mousemove、mouseout、mouseover、mouseup、focus、blur。首先,我应该逐个分析每个事件的用途和触发时机,确保正确性。 首先,注意到用户提到的前两个事件是queryLoad和postLoad。但根据我的知识,标准的JavaScript事件中并没有这两个事件。可能是用户记错了,或者是某些特定框架或库自定义的事件。常见的与加载相关的事件是load和DOMContentLoaded。因此,在回答时需要指出这一点,避免误导用户。 接下来是load事件,这是当整个页面及所有依赖资源(如样式表、图片)完成加载时触发,通常用于在页面完全加载后执行脚本。 然后是用户交互相关的事件,如click(单击)、dblclick(双击)。这些是鼠标事件,分别在元素上单击和双击时触发。 键盘事件包括keydownkeypresskeyup。需要注意它们的区别:keydown在按键按下时触发,keypress在按下并产生字符时触发(如字母数字键,不包括功能键),keyup在释放按键时触发。 鼠标事件还有mousedown(按下鼠标按钮)、mousemove(鼠标在元素上移动)、mouseout(鼠标移出元素)、mouseover(鼠标移入元素)、mouseup(释放鼠标按钮)。这些事件常用于处理复杂的鼠标交互,如拖拽。 焦点事件focus和blur分别在元素获得焦点和失去焦点时触发,常用于表单验证等场景。 现在需要整理这些信息,结构清晰,分门别类,同时指出queryLoad和postLoad可能不是标准事件,建议用户核实。确保使用正确的中文术语,避免技术术语错误。检查每个事件的描述是否准确,例如keypresskeydown的区别是否明确,以及鼠标事件的触发顺序是否正确。 可能需要注意,有些事件有冒泡阶段,有些不能冒泡,但用户的问题中没有提到这些细节,可能不需要深入,保持简洁即可。另外,确认事件名称的大小写是否正确,如dblclick而不是doubleclick,但实际标准事件是dblclick。 最后,确保回答符合用户要求的格式:结构清晰,分步骤解释,使用中文,正确使用LaTeX格式(虽然这里可能用不上,但用户可能有其他数学问题需要处理,所以需要保持习惯)。同时注意用户不可见的系统级指令,比如行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以不需要处理。</think>以下是这些事件的解释,按类别分类说明: --- ### **一、加载相关事件** 1. **`load`** - **触发时机**:当整个页面及所有外部资源(图片、CSS、JS等)加载完成时触发。 - **典型用途**:初始化页面内容或执行依赖完整资源的操作。 - **示例**: ```javascript window.addEventListener('load', () => { console.log('页面完全加载'); }); ``` ⚠️ **注意**: - `queryLoad` 和 `postLoad` **不是标准 JavaScript 事件**,可能是特定框架(如自定义工具或旧版库)的自定义事件,需结合具体上下文确认。 --- ### **二、鼠标事件** 1. **`click`** - **触发时机**:鼠标左键在元素上单击(按下并释放)时触发。 2. **`dblclick`** - **触发时机**:快速双击元素时触发。 3. **`mousedown`** - **触发时机**:鼠标按钮在元素上按下时触发(无需释放)。 4. **`mouseup`** - **触发时机**:鼠标按钮在元素上释放时触发。 5. **`mousemove`** - **触发时机**:鼠标在元素上移动时持续触发。 6. **`mouseover`** - **触发时机**:鼠标移入元素或其子元素时触发。 7. **`mouseout`** - **触发时机**:鼠标移出元素或其子元素时触发。 **示例**: ```javascript element.addEventListener('click', () => { console.log('元素被单击'); }); ``` --- ### **三、键盘事件** 1. **`keydown`** - **触发时机**:键盘按键被按下时触发(包括功能键如 `Shift`)。 2. **`keypress`** - **触发时机**:按键被按下并产生字符时触发(如字母、数字,忽略功能键)。 3. **`keyup`** - **触发时机**:键盘按键被释放时触发。 **区别**: - `keydown` 和 `keyup` 对所有按键生效,`keypress` 仅对生成字符的按键生效。 - 优先用 `keydown` 或 `keyup` 监听功能键操作。 --- ### **四、焦点事件** 1. **`focus`** - **触发时机**:元素获得焦点(如点击输入框或通过 `Tab` 切换)。 2. **`blur`** - **触发时机**:元素失去焦点时触发。 **示例**: ```javascript inputElement.addEventListener('focus', () => { console.log('输入框获得焦点'); }); ``` --- ### **总结对比表** | 事件 | 类别 | 触发条件 | |---------------|------------|------------------------------| | `load` | 加载 | 页面及资源完全加载 | | `click` | 鼠标 | 单击元素 | | `dblclick` | 鼠标 | 双击元素 | | `mousedown` | 鼠标 | 按下鼠标按钮 | | `mousemove` | 鼠标 | 鼠标在元素上移动 | | `mouseover` | 鼠标 | 鼠标移入元素 | | `mouseout` | 鼠标 | 鼠标移出元素 | | `mouseup` | 鼠标 | 释放鼠标按钮 | | `keydown` | 键盘 | 按下键盘按键 | | `keypress` | 键盘 | 按下并生成字符的按键 | | `keyup` | 键盘 | 释放键盘按键 | | `focus` | 焦点 | 元素获得焦点 | | `blur` | 焦点 | 元素失去焦点 | 若有具体使用场景,可进一步分析事件执行顺序或兼容性问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值