winform窗体的键盘基本控制

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。)
  • 区别: 其中KeyDownKeyPress事件一样,都是按键按下之后先后发生,但是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.主要区别

  1. KeyPress主要用于捕获数字(注意:包括shift+数字的符号)、字母(包括大小写)、小键盘等,除了F1-12SHIFTAltCtrlInsertHomePgUpDeleteEndPgDnScrollLockPauseNumLock、菜单键、开始键和方向键外的ANSI字符
  2. KeyDownKeyUp通常可以捕获键盘除了PrScrn所有按键。(不包括特殊键盘的特殊键,比如机械键盘的宏定义键盘
  3. KeyPress只能够捕获单个字符。
  4. KeyDownKeyUp 可以捕获组合键。
  5. KeyPress 可以捕获单个字符的大小写。
  6. KeyDownKeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。
  7. KeyPress 不区分小键盘和主键盘的数字字符。
  8. KeyDownKeyUp 区分小键盘和主键盘的数字字符。
  9. 其中PrScrn 按键KeyPressKeyDownKeyUp 都不能捕获。

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"。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值