winform窗体的键盘基本控制
1.简单介绍
1.1 KeyPreview属性
- 确定窗体上控件的键盘事件是否已向窗体注册
- 如果我们将窗体的
KeyPreview
的属性值设置为True
,那么窗体将会比其内部的控件优先获得键盘事件的激活权!
例如当我们的窗体之中有着button按钮,当你设置了键盘事件,例如KeyDown
事件,但是同时你也设置了窗体的KeyDown
事件,那么在你按下按键的时候,键盘事件会响应button按钮对应的键盘事件,而不会响应窗体设置的KeyDown
事件。但是如果此时你设置了KeyPreview
属性值为True
。此时再次按下按键,则会优先响应窗体的键盘事件,再会响应按钮的键盘事件! - 示例
private: System::Void FrmMain_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
MessageBox::Show("窗体");
}
}
private: System::Void btn_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
MessageBox::Show("按钮");
}
}
若设置了KeyPreview
属性值为True
,则会先弹出“窗体”!再弹出“按钮”!
若KeyPreview
属性值为False
,则只会弹出“按钮”。
1.2 KeyDown事件、KeyPress事件以及KeyUp事件
1.2.1 简单介绍
- 根据MSDN所讲述,三者之间触发的顺序依次是:KeyDown>KeyPress>KeyUp.
(虽然触发的顺序KeyDown
,但是响应的顺序KeyDown
迟于KeyPress
。) - 区别: 其中
KeyDown
与KeyPress
事件一样,都是按键按下之后先后发生,但是KeyUp
与其不同,是在按键释放的时候发生!!
1.2.2 KeyDown事件
- 当键盘按下即触发事件
- 示例
private: System::Void FrmMain_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
MessageBox::Show("down");
}
}
(记住,这是窗体的的键盘事件,应该先将KeyPreview
设置为True
。)
按下键盘上的W即会触发!弹出“down”。
1.2.3 KeyPress事件
- 当键盘按下即触发事件
- 示例
private: System::Void FrmMain_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
if (e->KeyChar =='w') {
MessageBox::Show("press");
}
}
(记住,这是窗体的的键盘事件,应该先将KeyPreview
设置为True
。)
按下键盘上的W即会触发!弹出“press”。
- 另一种示例
private: System::Void FrmMain_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
if (e->KeyChar <= 100) {
MessageBox::Show("press");
}
}
当按下键,键的ASCII的值不大于100的时候都会触发事件,并且区分大小写!
1.2.4 KeyUp事件
- 当键盘释放的时候,触发该事件
- 示例
private: System::Void FrmMain_KeyUp(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
MessageBox::Show("up");
}
}
当释放按键w的时候,会弹出“up”。
2.主要区别
KeyPress
主要用于捕获数字(注意:包括shift+数字的符号)、字母(包括大小写)、小键盘等,除了F1-12
、SHIFT
、Alt
、Ctrl
、Insert
、Home
、PgUp
、Delete
、End
、PgDn
、ScrollLock
、Pause
、NumLock
、菜单键、开始键和方向键外的ANSI字符KeyDown
和KeyUp
通常可以捕获键盘除了PrScrn
所有按键。(不包括特殊键盘的特殊键,比如机械键盘的宏定义键盘)KeyPress
只能够捕获单个字符。KeyDown
和KeyUp
可以捕获组合键。KeyPress
可以捕获单个字符的大小写。KeyDown
和KeyUp
对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。KeyPress
不区分小键盘和主键盘的数字字符。KeyDown
和KeyUp
区分小键盘和主键盘的数字字符。- 其中
PrScrn
按键KeyPress
、KeyDown
和KeyUp
都不能捕获。
3.注意
- 触发
KeyDown
后,不一定触发KeyUp
事件,因为当你触发KeyDown
事件的时候,你移动鼠标,或者按其他的键时候,KeyUp
事件则不会被触发!
private: System::Void FrmMain_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
down++;
MessageBox::Show("down");
}
}
private: System::Void FrmMain_KeyUp(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
up++;
MessageBox::Show("up");
}
}
此时若你按住了w键,会弹出“down”,但是此时你释放了w键,再次按住回车键,将弹框关闭,则不会再次触发keyUp
事件了。但是,按住了w键,关闭了弹窗,再释放w键,此时会触发KeyUp
事件,弹出“up”。
- KeyDown与KeyPress的触发
private: System::Void FrmMain_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyData == Keys::W) {
MessageBox::Show("down");
}
}
private: System::Void FrmMain_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
if (e->KeyChar == 'w') {
MessageBox::Show("press");
}
}
KeyPress
的触发在KeyDown
之后,但是响应确是KeyPress
在前。
当你按下w键(此时需要为小写,因为KeyPress
识别大小写。)会先弹出"press",再弹出"down"。