WinForm键盘事件

最近用WinForm做了一个俄罗斯方块的小游戏,其中在处理键盘事件的时候出了点问题,经过查阅资料和反复调试,总结键盘事件如下:

1.键盘事件的响应顺序为KeyDown>KeyPress>KeyUp;

2.KeyDown能响应所有按键,KeyPress能响应除方向键和F1、F2...的其他按键;

3.消息在WndProc处理之前,PreProcessMessage方法会调用多个方法对键盘消息进行预处理;

4.KeyDown的预处理方法:(按执行的先后顺序)

(1)ProcessCmdKey,此方法处理命令键,命令键的优先级高于常规键。 如果此方法返回 true,则将不调度键消息,而且将不发生键事件。 如果此方法返回 false,则将调用IsInputKey.

(2)IsInputKey,如果此方法返回 true,则表示该控件为常规字符,而且将引发KeyDown事件。 如果此方法返回 false,则将调用 ProcessDialogKey。

(3)ProcessDialogKey,此方法处理在控件内实现特殊功能(如在控件及其父级之间切换焦点)的物理按键。 如果中间控件不处理该键,则将调用父控件的 ProcessDialogKey,直至层次结构中的最顶端控件。 如果此方法返回 true,则将完成预处理,而且将不生成按键事件。 如果此方法返回 false,则将发生KeyDown 事件。(我做的程序里面就是这里遇到问题了,窗口上有两个按钮,这时方向键无法响应 KeyDown 事件。重写 ProcessDialogKey 方法后,下断点调试发现父类的同名方法返回值为true,表示已经完成预处理。这里应该是窗口默认的把方向键用来处理按钮的焦点切换,改成直接返回false后可以响应KeyDown事件,但是不能切换按钮的焦点。)

5.KeyPress 的预处理方法:

(1)IsInputChar,如果该字符是普通字符,则此方法返回 true,并且将引发 KeyPress事件,而且不再进行预处理。 否则,将调用 ProcessDialogChar。

(2)ProcessDialogChar,类似于 ProcessDialogKey,将沿控件的层次结构向上调用此方法。 如果控件是容器控件,此方法将通过调用控件及其子控件的 ProcessMnemonic 来检查助记键。 如果 ProcessDialogChar 返回 true,则 KeyPress 事件不会发生。

6.消息在到达WndProc后,会由一组可以重写的方法进行处理,这些方法返回值均为 Boolean。如果返回值为true 表示消息处理完成,它将不传递给基控件或父控件进一步处理,否则,消息将停留在消息队列里,可能有基控件或者父控件进一步处理。

(1)ProcessKeyMessage,此方法处理控件的WndProc方法接受的所有键盘消息。

(2)ProcessKeyPreview,此方法将键盘事件发送到父控件。如果返回值为 true,则不生成键盘事件,否则将调用 ProcessKeyEventArgs

(3)ProcessKeyEventArgs,此方法根据需要引发 KeyDown、KeyPress 和 KeyUp 事件。

以上就是我对WinForm键盘事件的总结。

时间: 2024-11-09 02:29:26

WinForm键盘事件的相关文章

C#/winform 自动触发鼠标、键盘事件

要在C#程序中触发鼠标.键盘事件必须要调用windows函数. 一.鼠标事件的触发 1.引用windows函数mouse_event /// <summary> /// 鼠标事件 /// </summary> /// <param name="flags">事件类型</param> /// <param name="dx">x坐标值(0~65535)</param> /// <param

C# WinForm自定义控件响应键盘事件

自己定义的winform控件,用其他键盘事件都无法响应,只有用ProcessCmdKey事件可以达到目的(别忘了主窗体的KeyPreview属性要设置为true),写法如下:         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)         {             switch (keyData)             {                 case Keys.Alt | 

JQuery中如何处理键盘事件

背景:比如在页面中,敲击回车键以后,实现登录功能,在之前的Winform开发时,也遇到过处理键盘事件的功能,比如游戏软件中,上下左右的移动等. 代码如下: 1 $(document).keydown(function (event) { 2 if (event.keyCode == 13) 3 { 4 alert('OK'); 5 //$("#btn1").click(); 6 } 7 }); 上面代码的功能是,在页面上任意位置,敲击回车,弹出‘OK’的消息框.

基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: 要实现以上的功能,需要几个对象: 事件分派器:EventDispatcher,负责将 BaseEvent 分派给 EventListener 对象 事件监听器:EventListener,这只是一个接口类,接受 BaseEvent 的对象,真正的处理在它的子类中实现 事件:BaseEvent,储存

键盘事件相关

转自下面两个链接:http://www.cnblogs.com/starof/p/6558581.html   http://www.cnblogs.com/cathsfz/archive/2011/05/29/2062382.html 在 JavaScript 中监听 IME 键盘输入事件 在 JavaScript 中监听用户的键盘输入是很容易的事情,但用户一旦使用了输入法,问题就变得复杂了.输入法应当如何触发键盘事件呢?是每一下击键都触发一次事件,还是选词完毕才触发事件呢?整句输入又该如何触

vue学习笔记(一)关于事件冒泡和键盘事件 以及与Angular的区别

一.事件冒泡 方法一.使用event.cancelBubble = true来组织冒泡 <div @click="show2()"> <input type="button" value="按钮" @click="show1($event)"> </div> methods:{ show1:function(ev){ console.log(ev); alert(1); ev.cancelB

jquery键盘事件总结

在工作中在发现同事在写输入密码按键的相关js效果时,发现自己对于这块很是不了解,这几天特地了解了一下,进行以下总结: 一.首先要知道键盘事件的几个属性: 1.keydown():在键盘按下时触发. 2.keyup():是按下键盘起来后的事件. 3.keypress():在敲击按键时触发,我们可以理解为按下并抬起同一个按键. 二.获得键盘上对应的 ascII 码: //键码获取 $(document).keydown(function (event) { alert(event.keyCode);

JavaScript的事件对象_键盘事件

用户在使用键盘时会触发键盘事件.“DOM2 级事件”最初规定了键盘事件,结果又删除了相应的内容.最终还是使用最初的键盘事件,不过 IE9 已经率先支持“DOM3”级键盘事件. 一.键码 在发生 keydown 和 keyup 事件时,event 对象的 keyCode 属性中会包含一个代码,与键盘上一个特定的键对应.对数字字母字符集,keyCode 属性的值与 ASCII 码中对应小写字母或数字的编码相同.字母中大小写不影响. <script type="text/javascript&q

(四)WebDriver API:控制浏览器及鼠标、键盘事件

参考文档:WebDriver官方文档,下载链接:http://download.csdn.net/detail/kwgkwg001/4004500 虫师:<selenium2自动化测试实战-基于python语言> 一.控制浏览器 webdriver主要提供操作页面上各种元素的方法,但它也提供操作浏览器的一些方法,例如控制浏览器大小.前进和后退等. 1.控制浏览器窗口大小 webdriver提供了set_window_size()方法来设置浏览器大小: # 控制浏览器大小 from seleni