C# 是否可以绕过RichTextBox输入

C# 是否可以绕过RichTextBox输入,c#,C#,我有一个RichTextBox(rtb_输入字段)。每当我在此RTB中键入任何内容并按Enter键时,我都会将键入的字符串发送到服务器。然后,我将相同的字符串放回rtb_inputField并以编程方式选择它(这样,用户可以快速发送相同的数据,只需再次按enter键,或者通过开始键入来发送另一个字符串)。到目前为止,一切都很好 现在我想做的是:如果NumLock被锁定,并且我按下任何numpad键(0-9),我想完全绕过rtb_输入字段。通过旁路,我的意思是:不要在RTB中键入任何数字,而是直接

我有一个RichTextBox(rtb_输入字段)。每当我在此RTB中键入任何内容并按Enter键时,我都会将键入的字符串发送到服务器。然后,我将相同的字符串放回rtb_inputField并以编程方式选择它(这样,用户可以快速发送相同的数据,只需再次按enter键,或者通过开始键入来发送另一个字符串)。到目前为止,一切都很好

现在我想做的是:如果NumLock被锁定,并且我按下任何numpad键(0-9),我想完全绕过rtb_输入字段。通过旁路,我的意思是:不要在RTB中键入任何数字,而是直接在其他地方处理这些数字。(我计划以这种方式将数据快速发送到服务器,而用户在RTB中编写的最后一个命令保持不变。)

但是如果NumLock没有被锁定,我希望numpad将数字输入RTB

这可能吗?如何实现

下面是我目前拥有的代码:(我对其进行了修改,以便您只看到与此问题相关的内容。)

private List numPadList=new List();
私有void populateNumPadList(){
numPadList.Add(key.NumPad0);
添加(key.NumPad1);
numPadList.Add(key.NumPad2);
添加(key.NumPad3);
添加(key.NumPad4);
添加(key.NumPad5);
添加(key.NumPad6);
添加(key.NumPad7);
添加(key.NumPad8);
添加(key.NumPad9);
}
私有void rtb_inputField_KeyDown(对象发送方,KeyEventArgs e){
if((numPadList.Contains(e.KeyData))&&(IsKeyLocked(Keys.NumLock))){
//用户按下了一个numpad键
Show(“您按下了:+e.KeyData.ToString());
e、 已处理=正确;
}
}
私有void rtb_inputField_KeyUp(对象发送方,KeyEventArgs e){
RichTextBox输入字段=(RichTextBox)发送方;
字符串userInput=inputField.Text.Trim();
if((e.KeyData==Keys.Enter)和&(sender==rtb_inputField)){
如果(客户端已连接){
宏字符串=通过宏字典(用户输入)运行输入;
//做事。。
writer.WriteLine(宏字符串);
}
}
//还有很多其他的东西。。
}

我的这段代码在某种意义上是有效的:它只在NumLock被锁定时触发,并且一个消息框告诉我按下了哪个numKey-但它不会像我所希望的那样绕过RichTextBox。

在按键事件处理程序中,当您认为自己已经完成了所有操作,并且RichTextBox不会继续按键时,将
e.Handled
设置为
true

private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (_toBeIgnored)
    {
        e.Handled = true;
        return;
    }
}

private bool _toBeIgnored;

private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (IsKeyLocked(Keys.NumLock))
    {
        _toBeIgnored = true;
        return;
    }
}

我不能禁用RTB,因为我想将两者都用作向服务器发送数据的手段。RTB是“更复杂但更慢”的数据发送方式,而numpad只能发送非常基本的快速命令。我的方法userSentInput()作为OnKeyDown事件注册到RichTextBox。我尝试将if语句移到顶部,并添加e.Handled=true,但没有成功。我尝试创建一个separe方法,注册到表单本身,但这也不起作用。我一定是做错了什么?(将用新的邮政编码更新原始邮政编码。)@Phrosen:同意,似乎一定是在KeyPress事件句柄中KeyPress的问题是:“KeyPress EventArgs”不包含“KeyData”的定义,因此我不知道如何检查它是否是一个numPad数字。两种方法都可以,KeyDown和KeyPress-似乎您需要在代码中同步,例如,在KeyDown中设置一个标志并在KeyPress中对其求值。我再次更新了原始帖子中的代码。我将旧用户sentinput更改为rtb_inputField_KeyUp,并添加了rtb_inputField_KeyDown。它们分别在KeyUp和KeyDown上触发。我摆脱了按键,因为我无法确定按下了哪个键。当前代码仍然不起作用。请举例说明如何在按键和按键之间进行同步?我不太明白你的意思。
private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (_toBeIgnored)
    {
        e.Handled = true;
        return;
    }
}

private bool _toBeIgnored;

private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (IsKeyLocked(Keys.NumLock))
    {
        _toBeIgnored = true;
        return;
    }
}