在一些控件里的keydown方法,没有办法捕获所有的按键消息
比如自己写一个窗体控件库,继承了UserControl
但是没有办法捕获一些键,比如方向键等
所以必须重载 processDialogkey 方法
processDialogkey 的描述 在msdn中是这样的
在消息预处理过程中调用此方法,以处理对话框字符,比如 Tab、Return、Esc 和箭头键。只有当 IsInputKey 方法指示控件未在处理该键时,才调用此方法。ProcessDialogKey 方法只是将字符发送给父级的ProcessDialogKey 方法,或者,在该控件没有父级的情况下返回 false。Form 类重写此方法来执行对话框键的实际处理。仅当控件承载在 Windows 窗体应用程序中或充当 ActiveX 控件时,才调用此方法。
给继承者的说明 在派生类中重写 ProcessDialogKey 方法时,控件应返回 true 以指示它已处理该键。对于未由该控件处理的键,应返回调用基类的 ProcessDialogChar 方法所得的结果。控件很少需要重写此方法(即使有的话)。
它的返回值表示
返回值
如果键已由控件处理,则为 true;否则为 false。
所以想捕获方向键 要加上如下重载方法
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right)
return false;
else
return base.ProcessDialogKey(keyData);
}
在keydown里就能接收到方向键的信息了
其实,在ProcessDialogKey重写的时候,就可以做信息处理的操作了
而不必再keydown方法里写
这样也可以
namespace writing
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == (Keys.Insert | Keys.Shift))
{
IDataObject data = Clipboard.GetDataObject();
string text = (string)data.GetData(DataFormats.UnicodeText);
MessageBox.Show(text);
}
return base.ProcessDialogKey(keyData);
}
}
}