我有一个RichTextBox(rtb_inputField)。每当我在此RTB中键入任何内容,然后按Enter键,我将输入的字符串发送到服务器。然后我将相同的字符串放回rtb_inputField并以编程方式选择它(这样用户可以快速发送相同的数据,只需再次按Enter键 - 或者通过开始键入它来发送另一个字符串。)到目前为止一切顺利。< / p>
现在我想要做的是:如果NumLock被锁定并按下任何一个小键盘键(0-9)我想完全绕过rtb_inputField。绕过我的意思是:不要在RTB中键入任何数字,而是直接在其他地方处理这些数字。 (我打算以这种方式快速向服务器发送数据,而用户在RTB中写的最后一个命令保持不变。)
但是如果NumLock没有锁定,我希望小键盘将数字放入RTB。
这可能吗?如何?
这是我目前的代码:(我已对其进行了修改,以便您只看到与此问题相关的内容。)
private List<Keys> numPadList = new List<Keys>();
private void populateNumPadList() {
numPadList.Add(Keys.NumPad0);
numPadList.Add(Keys.NumPad1);
numPadList.Add(Keys.NumPad2);
numPadList.Add(Keys.NumPad3);
numPadList.Add(Keys.NumPad4);
numPadList.Add(Keys.NumPad5);
numPadList.Add(Keys.NumPad6);
numPadList.Add(Keys.NumPad7);
numPadList.Add(Keys.NumPad8);
numPadList.Add(Keys.NumPad9);
}
private void rtb_inputField_KeyDown(object sender, KeyEventArgs e) {
if ((numPadList.Contains(e.KeyData)) && (IsKeyLocked(Keys.NumLock))) {
//The user pressed a numpad key
MessageBox.Show("You pressed: " + e.KeyData.ToString());
e.Handled = true;
}
}
private void rtb_inputField_KeyUp(object sender, KeyEventArgs e) {
RichTextBox inputField = (RichTextBox)sender;
string userInput = inputField.Text.Trim();
if ((e.KeyData == Keys.Enter) && (sender == rtb_inputField)) {
if (client.Connected) {
macroString = runInputThroughMacroDictionary(userInput);
//do stuff..
writer.WriteLine(macroString);
}
}
//lots of other stuff..
}
我在这个代码中运行的代码:它只在NumLock被锁定时触发,而MessageBox告诉我我按下了哪个numKey。 - 但它没有像我想要的那样绕过RichTextBox。
答案 0 :(得分:1)
在KeyPress事件处理程序中,当您认为已完成所有操作并且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;
}
}