C# KeyDown、KeyUp和KeyPress键盘事件的用法(附带实例)
当某一控件取得焦点时,若按了键盘键则会产生键盘事件:
键盘事件是先有 KeyDown 事件,然后有 KeyPress 事件,最后是 KeyUp 事件,当有键盘事件发生时,对于 KeyDown 和 KeyUp 事件而言,事件管理程序所传递的第 2 个参数是 KeyEventArgs e。如果是 KeyPress 事件,则传递 KeyPressEventArgs e 参数。
KeyCode:回传所按的键,可以由 Keys 列举常数得知所按的键,如 F1 到 F12,D0 到 D9(代表数字键)、A 到 Z(英文字母键),Up、Down、Left、Right(代表箭头键)。
【实例】设计会动的功能按钮,这个程序在功能按钮取得焦点后,若是按 Alt、Ctrl 或是 Shift 键则将功能按钮名称改为标记所按的键名称。同时按 Up、Down、Left 和 Right 可以移动功能按钮,每次移动 10 个像素。
【实例】设计成绩输入程序,这个程序在分数成绩部分只能输入 0~9 的数字,英文等级只能输入 A、B、C 和 F。输入如果错误,则会被阻挡,同时出现对话框告知输入错误发生。
- KeyDown:控件取得焦点,有键盘按下时则会产生此事件;
- KeyUp:控件取得焦点,放开键盘按键时则会产生此事件;
- KeyPress:控件取得焦点时,有键盘处于被按着的状态时则会产生此事件。
键盘事件是先有 KeyDown 事件,然后有 KeyPress 事件,最后是 KeyUp 事件,当有键盘事件发生时,对于 KeyDown 和 KeyUp 事件而言,事件管理程序所传递的第 2 个参数是 KeyEventArgs e。如果是 KeyPress 事件,则传递 KeyPressEventArgs e 参数。
C# KeyDown和KeyUp事件
当有键盘按键产生时,KeyEventArgs e 的属性如下:- Alt:回传是否按 Alt 键;
- Ctrl:回传是否按 Ctrl 键;
- Shift:回传是否按 Shift 键。
KeyCode:回传所按的键,可以由 Keys 列举常数得知所按的键,如 F1 到 F12,D0 到 D9(代表数字键)、A 到 Z(英文字母键),Up、Down、Left、Right(代表箭头键)。
【实例】设计会动的功能按钮,这个程序在功能按钮取得焦点后,若是按 Alt、Ctrl 或是 Shift 键则将功能按钮名称改为标记所按的键名称。同时按 Up、Down、Left 和 Right 可以移动功能按钮,每次移动 10 个像素。
using System; using System.Windows.Forms; namespace ch { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Up: button1.Top -= 10; // 往上移10像素 break; case Keys.Down: button1.Top += 10; // 往下移10像素 break; case Keys.Left: button1.Left -= 10; // 往左移10像素 break; case Keys.Right: button1.Left += 10; // 往右移10像素 break; } } private void button1_KeyDown(object sender, KeyEventArgs e) { if (e.Alt) button1.Text = "按 Alt 键"; if (e.Shift) button1.Text = "按 Shift 键"; if (e.Control) button1.Text = "按 Ctrl 键"; } } }执行结果如下图所示:

C# KeyPress事件
当产生 KeyPress 事件后,事件处理程序产生的参数 是KeyPressEventArgs e,这个 e 的属性如下:- KeyChar:用户所按的字符;
- Handled:默认是 false,表示不阻挡输入。如果设为 true 则阻挡输入。
【实例】设计成绩输入程序,这个程序在分数成绩部分只能输入 0~9 的数字,英文等级只能输入 A、B、C 和 F。输入如果错误,则会被阻挡,同时出现对话框告知输入错误发生。
using System; using System.Windows.Forms; namespace ch { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // 限制只能输入数字 0-9 private void txtScore_KeyPress(object sender, KeyPressEventArgs e) { int data = Convert.ToInt32(e.KeyChar); // 允许 Enter(13)或 Backspace(8)键 if (data == 13 || data == 8) return; // 0 的 ASCII 码是 48,9 的 ASCII 码是 57 if (data < 48 || data > 57) { e.Handled = true; MessageBox.Show("输入错误,只能输入0~9数字", "ch30_30"); } } // 限制只能输入字母 A、B、C、F private void txtGrade_KeyPress(object sender, KeyPressEventArgs e) { int data = Convert.ToInt32(e.KeyChar); // 允许 Enter(13)或 Backspace(8)键 if (data == 13 || data == 8) return; // A 的 ASCII 码是 65,F 的 ASCII 码是 70 // D 的 ASCII 码是 68,E 的 ASCII 码是 69 if ((data < 65 || data > 70) || (data >= 68 && data <= 69)) { e.Handled = true; MessageBox.Show("输入错误,只能输入A,B,C,F", "ch30_30"); } } } }执行结果为:
