.NET解释在文本框中输入key作为Tab

时间:2011-08-09 19:37:01

标签: c# .net textbox

这个简单的问题在.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);
    }
}

2 个答案:

答案 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来使用现有的标签排序