3

我正在用 C# winform 制作一个自定义终端。当用户按下TextBox我正在使用的键时,我必须确保它是有效键。我需要阻止他们删除内容并为所欲为。我设法通过KeyPressandKeyDown事件处理退格和删除等。我遇到了用户按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
}

我怎样才能检测到这个键以及在哪里(在哪个事件中,KeyPress或者KeyDown?)

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

4

2 回答 2

4

您可以在 KeyDown 事件中尝试类似的操作。

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Shift && e.KeyCode == Keys.Delete) e.Handled = true;
}
于 2012-09-10T17:57:14.163 回答
4

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

如果您愿意,您也可以处理按键事件以便您可以防止无效字符/键首先更改文本(并导致完全验证),但这基本上就像在客户端上执行字段验证一样网页; 这样做很好,但既然你可以绕过它,你就不能使用它。

于 2012-09-10T17:59:24.970 回答