【发布时间】:2012-09-03 15:07:02
【问题描述】:
我正在 C# winform 中制作自定义终端。当用户按下我正在使用的TextBox 中的一个键时,我必须确保它是一个有效的键。我需要阻止他们删除内容并为所欲为。我设法通过KeyPress 和KeyDown 事件处理退格和删除等。我遇到了用户按 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。
【问题讨论】:
-
“C# 形式的终端”是什么意思,如果您没有使用该热键显式添加功能,为什么 Shift+Delete 会在您的应用程序中执行任何操作?
-
您禁用单个热键的整个方法似乎存在缺陷。但如果你不写更多关于你正在做什么的文章,就很难给出一个好的替代方案。
-
它不是像 Linux 中那样的“真实”终端,它只是一个文本框,您可以给它命令,这些命令是您制作的程序并集成到该“终端”.. 所以它就像一个终端,每次你按回车键,我接受你输入的命令,我接受它的参数,看看这个命令是否存在于我所有的命令中,如果存在,用你传递的 args 执行它.. 等等跨度>
标签: c# winforms keypress onkeydown