. 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);
}
}
这很好。只是一些细节,如果文本框是多行的,或者当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以使用现有的选项卡排序