C# I';我正在WinForm上捕获密钥,但我';我想看看按下的键是不是一个';字符串';-得到一个例外
这是我的密码:C# I';我正在WinForm上捕获密钥,但我';我想看看按下的键是不是一个';字符串';-得到一个例外,c#,key,C#,Key,这是我的密码: void gkh_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == neededLetter as Keys) { if (neededLetter == "n") { neededLetter = "o";
void gkh_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == neededLetter as Keys)
{
if (neededLetter == "n")
{
neededLetter = "o";
}
else if (neededLetter == "o")
{
neededLetter = "t";
}
else if (neededLetter == "t")
{
neededLetter = "e";
}
else if (neededLetter == "e")
{
this.Show();
}
}
else
{
neededLetter = "n";
}
}
我在第一个If块上得到一个错误:
as运算符必须与
引用类型或可空类型
编辑:更清楚地说:
用户按下一个键,计算机将该e.Keycode与设置了字母“n”的字符串变量进行比较。如果为true,则将变量needLetter设置为“o”
之后,当用户按下另一个键(如果是“o”)时,将所需字母保存到“t”。以此类推。是一个枚举值。从MSDN文档中:
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
// Determine whether the key entered is the F1 key. If it is, display Help.
if(e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
// Display a pop-up Help topic to assist the user.
Help.ShowPopup(textBox1, "Enter your name.", new Point(textBox1.Bottom, textBox1.Right));
}
else if(e.KeyCode == Keys.F2 && e.Modifiers == Keys.Alt)
{
// Display a pop-up Help topic to provide additional assistance to the user.
Help.ShowPopup(textBox1, "Enter your first name followed by your last name. Middle name is optional.",
new Point(textBox1.Top, this.textBox1.Left));
}
}
使用以下命令:
if (e.KeyCode == (Keys)neededLetter[0])
也许您应该将所需的字母设置为char
type,这样您就可以使用:
if (e.KeyCode == (Keys)neededLetter)
或者更好的方法是,只需将所需字母设置为键
类型,这样您就可以执行以下操作:
if (e.KeyCode == neededLetter)
{
if (neededLetter == Keys.N)
neededLetter = Keys.O;
else if (neededLetter == Keys.O)
neededLetter = Keys.T;
...
}
@Sergio,re:仅一键输入:
是的,它只接受一个键盘输入。事实上,如果您想要解释像Ctrl+A这样的组合键,您无法在e.KeyCode中同时捕获这两个组合键,只有最后按下的键(常规键或其他(键修改器))在e.KeyCode中注册。如果没有键修饰符布尔属性,如e.Control、e.Shift、e.Alt,我们将无法读取键盘快捷键,我们将不得不运行自己的例程来设置状态变量并检测这些键盘修饰符是否仍由用户持有。但幸运的是,有一个内置属性指示修改器仍由用户持有,因此我们可以这样做:
if (e.KeyCode == Keys.A && e.Control)
MessageBox.Show("Test");
测试e.KeyCode是否只注册最后一个键,而不管它是键(A)还是键修改器(Ctrl)。试着按住A键(不要松开),然后按Ctrl键,屏幕上会弹出“Test”一词not,最后按下的(Ctrl键)也会在e.KeyCode上注册。但如果您按住Ctrl键,则A会在屏幕上弹出“Test”一词,即Control是一种表示用户是否仍按住Ctrl键的状态。您可以使用更简单的逻辑,使用
按键来执行此操作,如下所示:
string buffer = ""; //buffer to store what the user typed: n, no, not, etc...
void gkh_KeyPress(object sender, KeyPressEventArgs e)
{
buffer += e.KeyChar; //add key to the buffer, then check if we've made progress
if (buffer.IndexOf("note") > -1) {
this.Show(); //"notes" matched completely
buffer = ""; //reset for another run
}
else if ("note".IndexOf(buffer) != 0) {
buffer = ""; //Another key not in sequence was hit
}
}
我知道,;我不知道如何将枚举值与字符串变量进行比较。很抱歉造成混淆。如果必须是字符串,您可以调用e.KeyCode.ToString()==“e”
,但我建议将它们作为枚举而不是字符串进行比较。感谢您的帮助,但我将捕获输入“note”。这意味着用户将首先键入n,然后键入o,然后键入t,然后键入e;然后我的窗口就会出现。这就是为什么我需要将按下的键的e.Keycode与本地字符串变量进行比较的原因。:)仅供参考:这是一个编译器错误(特别是语法错误)。程序运行时会发生异常。如果(e.KeyCode==(Keys)neededLetter){}这是有效的,但我想知道为什么。。。键是否只接受单个字符?@Sergio:Keys
是一个枚举,表示键盘上的单个键(不包括修改键)。因此,是的,Keys
仅用于单个字符。@亚当·罗宾逊:相反,Keys enum中也包含修饰符,请参阅我对塞吉奥的回复,key修饰符也注册到e.KeyCode(Keys
type)。或者我误读了你的话,这就是我所说的“键盘上的单键(不包括修改键)”的意思。对不起,这让人困惑。