关于C#的Form_KeyPress和ProcessCmdKey

xsluo82 2007-02-09 01:35:44
在Form中,想实现按Enter键来实现Tab键的功能,我在Form中加了如下代码:
private void I01Frm03_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
{
ProcessTabKey(true);
}
}
但是没有作用,但是我覆盖了ProcessCmdKey函数:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter && !btn_return.Focused && !btn_run.Focused)
{
System.Windows.Forms.SendKeys.Send("{tab}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
便实现了。

请高手们告诉我原因,并告诉我ProcessCmdKey的作用,不胜感激!
...全文
3636 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
guojh021 2007-03-15
  • 打赏
  • 举报
回复
学习...

ProcessDialogKey
ProcessCmdKey
有什么差异?
北京的雾霾天 2007-02-09
  • 打赏
  • 举报
回复
值都是13,你说有什么区别!

如果说区别,那就是有不同的叫法而已!
fxfeixue 2007-02-09
  • 打赏
  • 举报
回复
Keys.Enter 与 Keys.Return 有什么区别呢?
北京的雾霾天 2007-02-09
  • 打赏
  • 举报
回复
在你的窗体里添加如下的代码就行了:

protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Enter)
{
keyData = Keys.Tab;
}
return base.ProcessDialogKey(keyData);
}
xsluo82 2007-02-09
  • 打赏
  • 举报
回复
但是我把(char)Keys.Return改成(char)Keys.Enter后
private void I01Frm03_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
ProcessTabKey(true);
}
}
还是不行啊
北京的雾霾天 2007-02-09
  • 打赏
  • 举报
回复
你最好重写ProcessDialogKey而不是处理ProcessCmdKey事件来处理你的回车.

Keys.Enter和Keys.Return都是回车键产生的.
fxfeixue 2007-02-09
  • 打赏
  • 举报
回复
处理命令键。
protected virtual bool ProcessCmdKey(
ref Message msg,
Keys keyData
);

参数
msg
通过引用传递的 Message,它表示要处理的窗口消息。
keyData
Keys 值之一,它表示要处理的键。
返回值
如果字符已由控件处理,则为 true;否则为 false。

备注
在消息预处理过程中调用此方法,以处理命令键。命令键是始终比常规输入键具有优先权的键。命令键的示例包括快捷键和菜单快捷方式。此方法必须返回 true,以指示它已经处理完命令键,或者 false,以指示该键不是命令键。仅当控件承载在 Windows 窗体应用程序中或充当 ActiveX 控件时,才调用此方法。

ProcessCmdKey 方法首先确定控件是否有 ContextMenu,如果有,则允许 ContextMenu 处理命令键。如果命令键不是菜单快捷方式,且控件有父级,那么该键传递到父级的 ProcessCmdKey 方法。净效果是命令键在控件层次结构中向上“冒”。除了用户按下的键外,键数据还指示哪些(如果有的话)修改键与该键同时按下。修改键包括 SHIFT、CTRL 和 ALT 键。

对继承者的说明: 在派生类中重写 ProcessCmdKey 方法时,控件应返回 true 以指示它已处理该键。对于未由该控件处理的键,应返回调用基类的 ProcessCmdKey 方法的结果。控件很少需要重写此方法(即使有的话)。

fxfeixue 2007-02-09
  • 打赏
  • 举报
回复
选择下一个可用控件并使其成为活动控件。
protected virtual bool ProcessTabKey(bool forward);

参数forward :
如果在 ContainerControl 内的控件中向前循环,则为 true;否则为 false。

返回值:
如果选定了一个控件,则为 true;否则为 false。

备注
无法选定 TabStop 属性设置为 false 的控件,因此将选定下一个可用控件。
fxfeixue 2007-02-09
  • 打赏
  • 举报
回复
是你写错了,应该判断是否等于Keys.Enter,而不是Keys.Return

private void I01Frm03_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
ProcessTabKey(true);
}
}

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧