. net将输入键解释为文本框上的选项卡

本文关键字:选项 文本 输入 解释 net | 更新日期: 2023-09-27 18:05:05

这个简单的问题在我使用。net和WinForms时多次出现。我有一个文本框,并希望将Enter键视为与Tab键相同,就像每当我按Enter时一样,我想要提高失去焦点,下一个控件要聚焦等。我注意到许多类似的问题,我可以通过捕获KeyDown和当检测到Enter移动焦点来解决问题,但我正在寻找的是一个最佳实践,如果不是洞察文本框控件在哪里检测Tab键内部以及它是如何做的,所以我可以添加一个"|| key == Keys.Enter"。这将阻止Keydown被提升,而是将焦点转移到下一个控件并引发其他适当的消息。

我以前检查过这个类似的问题. net文本框-处理回车键,但这不是我真正想要完成的。我真正想做的是尽早在文本框控件或拦截中将ENTER解释为TAB,并将ENTER更改为TAB,让文本框做它的事情。

编辑:这是我正在寻找的东西,但我不确定像这样修改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);
    }
}

. net将输入键解释为文本框上的选项卡

这很好。只是一些细节,如果文本框是多行的,或者当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;
}

这可能不是你想要的,但我过去所做的是检查在KeyPress事件中输入并使用Control。选择ectnextcontrol以使用现有的选项卡排序