如何检测(Shift + Delete)键按?

时间:2012-09-10 17:50:04

标签: c# winforms keypress onkeydown

我正在使用C#winform制作自定义终端。当用户按下我正在使用的TextBox中的密钥时,我必须确保它是有效密钥。我需要阻止他们删除东西并做任何他们想做的事情。我设法通过KeyPressKeyDown事件处理退格并删除其他内容。用户按 shift + delete 时出现问题。它删除了像 backspace 这样的东西。我不知道它的等价整数是多少。我做了一个C ++程序来检测它,很简单:

char c = _getch();
cout << (int)c << endl;

我得到了-32。它在C#中不起作用。

经过这么多次尝试包围它的价值,我发现它是0。 它起作用,至少在昨天,但现在它没有。我也可以删除shift + delete。

这是我的密钥验证方法:

private bool IsInvalidKey(char key)
{
  bool condition1 = !IsAsciiKey(key) && !IsNavigatingKey(key); // by navigation I mean: left, right, end and home keys.
  bool condition2 = (GetCaretPosition() == CaretPosition.OutsideCommandLine && !IsNavigatingKey(key));
  bool condition3 = ((key == (char)Keys.Back) && GetCaretPosition() == CaretPosition.BeginningOfCommandLine);
  return (condition1 || condition2 || condition3);
}

private bool IsAsciiKey(char key)
{
  return ((int)key > 0 && (int)key <= 127); // char(0) should be shift+delete
}

如何检测此密钥以及在何处(KeyPressKeyDown?)

我使用的是普通的TextBox控件,而不是RichTextBox

2 个答案:

答案 0 :(得分:4)

您不必通过使用KeyDown事件来查看每个单独的键,而是真正需要做的是在TextChanged事件中进行所有验证,并且需要验证整个条目(每次发生任何变化时,不仅仅是最后一个角色。这是支持用户可能执行的所有操作的唯一方法。例如,用户可以使用鼠标在文本框中剪切或粘贴文本,这根本不会触发任何按键事件。

如果需要,您可以处理按键事件以及,以便您可以防止无效字符/键首先更改文本(并导致完整验证)但这基本上是比如在网页上执行字段的客户端验证;这很好,但既然你可以解决它,你就不能使用它。

答案 1 :(得分:3)

你可以在KeyDown事件中尝试这样的事情。

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Shift && e.KeyCode == Keys.Delete) e.Handled = true;
}