-
Visual Basic 2005 - 如何于控件中捕捉按键
如何于 Windows Form 控件中捕捉按键向来是许多程序设计师所关心的课题,基本上,标准的 KeyUp 、 KeyDown 与 KeyPress 事件就足以去捕捉并处理按键。然而问题在于,并非所有的控件会在所有的情况下替所有的按键动作产生这些事件。
如果您希望不管控件的状况为何,都能够顺利捕捉 Windows Form 控件中的按键,必须根据该控件的类别衍生出一个新的类别并覆写 ProcessCmdKey 方法,并于此覆写方法中撰写程序代码来捕捉并处理您所需的按键。 系统会传第两个参数给 ProcessCmdKey 方法: msg 与 keyData 。 msg 参数内含所要处理的窗口讯息(例如: WM_KEYDOWN ),此窗口讯息是以传址方式传递的。 keyData 参数则会内含被按下之按键的按键码,也就是其中一个 Keys 值(注: keyData 参数的类型是 Keys 列举类型)。如果 CTRL 或 ALT 键也被按下, keyData 参数还会内含辅助按键( Modifier Key )信息。
您并非一定非得使用 msg 参数不可,也就是说,您可以忽略它。不过利用 msg 参数来检测窗口讯息倒是一项不错的选择。在稍后的程序范例中,我们会去检测窗口讯息是否为 WM_KEYDOWN 以便确认这是一个按键事件,此外,我们也会去检测窗口讯息是否为 WM_SYSKEYDOWN 以便确认按键组合是否包含辅助按键。
如果您希望不管控件的状况为何,都能够顺利捕捉 Windows Form 控件中的按键,必须根据该控件的类别衍生出一个新的类别并覆写 ProcessCmdKey 方法,并于此覆写方法中撰写程序代码来捕捉并处理您所需的按键。 系统会传第两个参数给 ProcessCmdKey 方法: msg 与 keyData 。 msg 参数内含所要处理的窗口讯息(例如: WM_KEYDOWN ),此窗口讯息是以传址方式传递的。 keyData 参数则会内含被按下之按键的按键码,也就是其中一个 Keys 值(注: keyData 参数的类型是 Keys 列举类型)。如果 CTRL 或 ALT 键也被按下, keyData 参数还会内含辅助按键( Modifier Key )信息。
您并非一定非得使用 msg 参数不可,也就是说,您可以忽略它。不过利用 msg 参数来检测窗口讯息倒是一项不错的选择。在稍后的程序范例中,我们会去检测窗口讯息是否为 WM_KEYDOWN 以便确认这是一个按键事件,此外,我们也会去检测窗口讯息是否为 WM_SYSKEYDOWN 以便确认按键组合是否包含辅助按键。
图表 1 <?xml:namespace prefix = o />
由于 DataGridView 控件的状况最为复杂,因而在此我们就要示范如何于 DataGridView 控件中捕捉按键,请切记,您可以将同样的手法应用在其它的控件。图表 1 所示者是我们所撰写之程序范例的执行画面,从窗体的标题列变化可以看出,只要 DataGridView 控件取得焦点,而且不论它是否显示数据,都能够捕捉用户于 DataGridView 控件中的按键。显而易见地,本程序范例的关键就在于必须根据 DataGridView 控件衍生出一个新的类别并覆写其 ProcessCmdKey 方法,兹将衍生类别 MyDataGridView 的程序代码列示如下:
Public Class MyDataGridView
Inherits System.Windows.Forms.DataGridView
…
…
Public Class MyDataGridView
Inherits System.Windows.Forms.DataGridView
…
…
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, _
ByVal keyData As Keys) As Boolean
Const WM_KEYDOWN As Integer = &H100
Const WM_SYSKEYDOWN As Integer = &H104
If ((msg.Msg = WM_KEYDOWN) Or _
(msg.Msg = WM_SYSKEYDOWN)) Then
Select Case (keyData)
Case Keys.Down
Me.Parent.Text = " 向下键已经被捕捉 "
Case Keys.Up
Me.Parent.Text = " 向上键已经被捕捉 "
Case Keys.Left
Me.Parent.Text = " 向左键已经被捕捉 "
Case Keys.Right
Me.Parent.Text = " 向右键已经被捕捉 "
Case Keys.Home
Me.Parent.Text = "Home 键已经被捕捉 "
Case Keys.End
Me.Parent.Text = "End 键已经被捕捉 "
Case Keys.PageUp
Me.Parent.Text = "PageUp 键已经被捕捉 "
Case Keys.PageDown
Me.Parent.Text = "PageDown 键已经被捕捉 "
Case Keys.Tab
Me.Parent.Text = "Tab 键已经被捕捉 "
Case (Keys.Shift Or Keys.Tab)
Me.Parent.Text = "<Shift> + Tab 键已经被捕捉 "
Case (Keys.Control Or Keys.Home)
Me.Parent.Text = "<CTRL> + Home 键已经被捕捉 "
Case (Keys.Control Or Keys.End)
Me.Parent.Text = "<CTRL> + End 键已经被捕捉 "
Case (Keys.Control Or Keys.M)
Me.Parent.Text = "<CTRL> + M 已经被捕捉 "
Case (Keys.Alt Or Keys.Z)
Me.Parent.Text = "<ALT> + Z 已经被捕捉 "
End Select
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
本文节录自 《 Visual Basic 2005程序开发与界面设计秘诀 》 一书,特此声明之。 Visual C# 2005 的用户请参阅 《 Visual C# 2005程序开发与界面设计秘诀 》 一书。
ByVal keyData As Keys) As Boolean
Const WM_KEYDOWN As Integer = &H100
Const WM_SYSKEYDOWN As Integer = &H104
If ((msg.Msg = WM_KEYDOWN) Or _
(msg.Msg = WM_SYSKEYDOWN)) Then
Select Case (keyData)
Case Keys.Down
Me.Parent.Text = " 向下键已经被捕捉 "
Case Keys.Up
Me.Parent.Text = " 向上键已经被捕捉 "
Case Keys.Left
Me.Parent.Text = " 向左键已经被捕捉 "
Case Keys.Right
Me.Parent.Text = " 向右键已经被捕捉 "
Case Keys.Home
Me.Parent.Text = "Home 键已经被捕捉 "
Case Keys.End
Me.Parent.Text = "End 键已经被捕捉 "
Case Keys.PageUp
Me.Parent.Text = "PageUp 键已经被捕捉 "
Case Keys.PageDown
Me.Parent.Text = "PageDown 键已经被捕捉 "
Case Keys.Tab
Me.Parent.Text = "Tab 键已经被捕捉 "
Case (Keys.Shift Or Keys.Tab)
Me.Parent.Text = "<Shift> + Tab 键已经被捕捉 "
Case (Keys.Control Or Keys.Home)
Me.Parent.Text = "<CTRL> + Home 键已经被捕捉 "
Case (Keys.Control Or Keys.End)
Me.Parent.Text = "<CTRL> + End 键已经被捕捉 "
Case (Keys.Control Or Keys.M)
Me.Parent.Text = "<CTRL> + M 已经被捕捉 "
Case (Keys.Alt Or Keys.Z)
Me.Parent.Text = "<ALT> + Z 已经被捕捉 "
End Select
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
本文节录自 《 Visual Basic 2005程序开发与界面设计秘诀 》 一书,特此声明之。 Visual C# 2005 的用户请参阅 《 Visual C# 2005程序开发与界面设计秘诀 》 一书。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式