Visual C# 2005实现控件中捕获按键
来源:百度文库 编辑:神马文学网 时间:2024/04/29 08:49:48
如何于Windows Form控件中捕捉按键向来是许多程序员所关心的课题,基本上,标准的KeyUp、KeyDown与KeyPress事件就足以去捕捉并处理按键。然而问题在于,并非所有的控件会在所有的情况下为所有的按键操作产生这些事件。
图CH8_DemoForm004.cs运行画面
如果您希望不管控件的状况如何,都能够顺利地捕捉Windows Form控件中的按键,必须根据该控件的类派生出一个新的类并重写ProcessCmdKey方法,并在此重写方法中编写程序代码来捕捉并处理您所需的按键。系统会传递两个参数给ProcessCmdKey方法:msg与keyData。msg参数含有所要处理的窗口信息(例如:WM_KEYDOWN),此窗口信息是以传址方式传递的。keyData参数则会含有被按下的按键的按键码,也就是其中一个Keys值(注意,keyData参数的类型是Keys枚举类型)。如果CTRL或ALT键也被按下,keyData参数还会含有辅助按键(Modifier Key)信息。
您并非一定要使用msg参数,也就是说,您可以忽略它。不过利用msg参数来检测窗口信息倒是一项不错的选择。在稍后的程序范例中,我们会去检测窗口信息是否为WM_KEYDOWN,以便确认这是一个按键事件。此外,我们也会去检测窗口信息是否为WM_SYSKEYDOWN,以便确认按键组合是否包含辅助按键。
由于DataGridView控件的状况最为复杂,因而在此我们就要示范如何在DataGridView控件中捕捉按键,请切记,您可以将同样的方法应用在其他的控件中。图2所示是程序范例CH8_DemoForm004.cs的运行画面,从窗体的标题栏变化可以看出,只要DataGridView控件取得焦点,不论它是否显示数据,都能够捕捉用户在DataGridView控件中的按键。显而易见地,本程序范例的关键在于必须根据DataGridView控件派生出一个新的类并重写其ProcessCmdKey方法。这里将派生类MyDataGridView的程序代码列示如下(编写在MyDataGridView.cs中):
public partial class MyDataGridView :
System.Windows.Forms.DataGridView
{
...
...
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) ||(msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Down:
this.Parent.Text = "向下键已经被捕捉";
break;
case Keys.Up:
this.Parent.Text = "向上键已经被捕捉";
break;
case Keys.Left:
this.Parent.Text = "向左键已经被捕捉";
break;
case Keys.Right:
this.Parent.Text = "向右键已经被捕捉";
break;
case Keys.Home:
this.Parent.Text = "Home 键已经被捕捉";
break;
case Keys.End:
this.Parent.Text = "End 键已经被捕捉";
break;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
图CH8_DemoForm004.cs运行画面
如果您希望不管控件的状况如何,都能够顺利地捕捉Windows Form控件中的按键,必须根据该控件的类派生出一个新的类并重写ProcessCmdKey方法,并在此重写方法中编写程序代码来捕捉并处理您所需的按键。系统会传递两个参数给ProcessCmdKey方法:msg与keyData。msg参数含有所要处理的窗口信息(例如:WM_KEYDOWN),此窗口信息是以传址方式传递的。keyData参数则会含有被按下的按键的按键码,也就是其中一个Keys值(注意,keyData参数的类型是Keys枚举类型)。如果CTRL或ALT键也被按下,keyData参数还会含有辅助按键(Modifier Key)信息。
您并非一定要使用msg参数,也就是说,您可以忽略它。不过利用msg参数来检测窗口信息倒是一项不错的选择。在稍后的程序范例中,我们会去检测窗口信息是否为WM_KEYDOWN,以便确认这是一个按键事件。此外,我们也会去检测窗口信息是否为WM_SYSKEYDOWN,以便确认按键组合是否包含辅助按键。
由于DataGridView控件的状况最为复杂,因而在此我们就要示范如何在DataGridView控件中捕捉按键,请切记,您可以将同样的方法应用在其他的控件中。图2所示是程序范例CH8_DemoForm004.cs的运行画面,从窗体的标题栏变化可以看出,只要DataGridView控件取得焦点,不论它是否显示数据,都能够捕捉用户在DataGridView控件中的按键。显而易见地,本程序范例的关键在于必须根据DataGridView控件派生出一个新的类并重写其ProcessCmdKey方法。这里将派生类MyDataGridView的程序代码列示如下(编写在MyDataGridView.cs中):
public partial class MyDataGridView :
System.Windows.Forms.DataGridView
{
...
...
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) ||(msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Down:
this.Parent.Text = "向下键已经被捕捉";
break;
case Keys.Up:
this.Parent.Text = "向上键已经被捕捉";
break;
case Keys.Left:
this.Parent.Text = "向左键已经被捕捉";
break;
case Keys.Right:
this.Parent.Text = "向右键已经被捕捉";
break;
case Keys.Home:
this.Parent.Text = "Home 键已经被捕捉";
break;
case Keys.End:
this.Parent.Text = "End 键已经被捕捉";
break;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
Visual C# 2005实现控件中捕获按键
Visual C# 2005实现控件中捕获按键
ComboBox 控件在 Visual Basic 2005 中
C#中对AxSpreadsheet控件的操作
C#中加强ListView控件的功能
在C#中使用属性控件添加属性窗口
C#中Property Grid(属性面板)控件的使用
|在C#程序中实现插件架构
在Visual FoxPro中使用TreeView控件|TreeView 控件 VFP|时...
【C#控件】MenuStrip控件(菜单控件)
C# 树型控件
C#制作WinForm控件
详解两种C#自动实现DLL(OCX)控件注册的方法 - 51CTO.COM
Visual C++中调用DLL实现数据加密
Visual Basic控件结构概述
Visual Basic中常用网格控件的区别与应用 - 《电脑知识与技术》 - 期刊杂志赏...
Delphi中不使用第三方控件实现XP风格
在C#中使用COM+实现事务控制
C#控件命名规范(标准)
日历控件的实现
一步一步创建Visual Basic .NET 控件
Visual Basic 6.0 控件参考手册下载
Visual Basic 6.0 控件和 .NET 控件的区别(续)
用Visual C#动态生成组件