【问题标题】:how to detect the (Shift+Delete) key press?如何检测(Shift+Delete)按键?
【发布时间】:2012-09-03 15:07:02
【问题描述】:

我正在 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

【问题讨论】:

  • “C# 形式的终端”是什么意思,如果您没有使用该热键显式添加功能,为什么 Shift+Delete 会在您的应用程序中执行任何操作?
  • 您禁用单个热键的整个方法似乎存在缺陷。但如果你不写更多关于你正在做什么的文章,就很难给出一个好的替代方案。
  • 它不是像 Linux 中那样的“真实”终端,它只是一个文本框,您可以给它命令,这些命令是您制作的程序并集成到该“终端”.. 所以它就像一个终端,每次你按回车键,我接受你输入的命令,我接受它的参数,看看这个命令是否存在于我所有的命令中,如果存在,用你传递的 args 执行它.. 等等跨度>

标签: c# winforms keypress onkeydown


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对于复制和粘贴,我通过将 ShortcutsEnabled 属性设置为 false 解决了这个问题 .. 但你对剪切的事情是正确的 .. 我必须修复它 .. :/
    • @VeXe 您仍然有一个固有的问题,即可以更改文本,而不仅仅是按一次按键。知道您支持每一个边缘案例的最简单方法是每次都验证所有内容。如果您尝试只查看按键事件,总会有一些您错过的东西。复制/粘贴只是一个例子。还有很多其他的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多