这个简单的问题在.NET中使用WinForms多次重复出现。我有一个文本框,并希望将Enter键视为与Tab键相同,就像我按下回车键,我想要丢失焦点,下一个控件要聚焦等等。我注意到许多类似的问题这个,我可以通过捕获KeyDown来解决问题,并且当检测到Enter时移动焦点,但我正在寻找的是最佳实践,如果没有洞察Textbox控件在内部检测Tab键的位置以及它如何是的,所以我可以添加一个“|| key == Keys.Enter”。这将阻止Keydown被提升,而是将焦点转移到下一个控件并引发其他适当的消息。
之前我检查了这个类似的问题 .NET TextBox - Handling the Enter Key但这不是我真正想要实现的目标。我真正想做的是尽可能早地将ENTER解释为文本框控件中的TAB或拦截并将Enter更改为选项卡并让文本框执行此操作。
编辑:这是我正在寻找的东西,但我不确定修改Windows消息的“安全性”......
class FancyTextBox : TextBox
{
public bool TreatEnterAsTab { get; set; }
const int WM_KEYDOWN = 0x100;
const int KEY_TAB= 9;
const int KEY_ENTER = 13;
public override bool PreProcessMessage(ref Message msg)
{
if (TreatEnterAsTab && msg.Msg == WM_KEYDOWN && msg.WParam.ToInt32() == KEY_ENTER)
msg.WParam = new IntPtr(KEY_TAB);
return base.PreProcessMessage(ref msg);
}
}
答案 0 :(得分:3)
这很好。只是一些细节,如果文本框是多行的,或者当Shift,Alt或Ctrl键关闭时,您不希望这样做。默认情况下打开它,这就是你使用它的原因:
using System;
using System.ComponentModel;
using System.Windows.Forms;
class FancyTextBox : TextBox {
public FancyTextBox() {
TreatEnterAsTab = true;
}
[DefaultValue(true)]
public bool TreatEnterAsTab { get; set; }
public override bool PreProcessMessage(ref Message msg) {
if (TreatEnterAsTab && (!this.Multiline || this.AcceptsReturn) &&
Control.ModifierKeys == Keys.None &&
msg.Msg == WM_KEYDOWN && (Keys)msg.WParam.ToInt32() == Keys.Enter) {
msg.WParam = (IntPtr)Keys.Tab;
}
return base.PreProcessMessage(ref msg);
}
private const int WM_KEYDOWN = 0x100;
}
答案 1 :(得分:2)
这可能不是您要找的,但我过去所做的是检查输入KeyPress事件并使用Control.SelectNextControl来使用现有的标签排序