如何使用C#中的keys枚举检测小写密钥?

时间:2011-11-17 14:51:18

标签: c# xna key

for (Keys k = Keys.A; k <= Keys.Z; k++)
{
    if (KeyPress(k))
        Text += k;
}

此代码检测我在键盘上按下的按键,它将打印出在控制台中按下的按键。但是,我在键盘上按了'a',但它出现'A'。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:9)

这是一个经常遇到的问题。问题是XNA不适合从键盘获取文本输入。它旨在获得键盘上每个键的当前状态。

虽然您可以编写自定义代码来检查是否按下shift等等,但是键盘不是您正在使用的键盘(例如,不同的语言,不同的布局)。大多数人所做的就是让窗户为你做。

如果您希望文本按预期显示,则需要基本上重新创建一些内容并让窗口为您执行此操作。

在此处查看Promit的帖子:http://www.gamedev.net/topic/457783-xna-getting-text-from-keyboard/

用法:

将他的代码添加到您的解决方案中。调用EventInput.Initialize in your game's Initialize`方法并订阅他的活动:

EventInput.CharEntered += HandleCharEntered;

public void HandleCharEntered(object sender, CharacterEventArgs e)
{
    var charEntered = e.Character;
    // Do something with charEntered
}

注意:如果您允许输入任何字符(例如带有变音符号的外国字符等),请确保您的SpriteFont支持它们! (如果没有,也许只是在将字体添加到文本字符串之前检查字体是否支持它,或者让spritefont使用特殊的“无效”字符)。

答案 1 :(得分:0)

查看提供的代码后,应该进行简单的修改:

[...]
for (Keys k = Keys.A; k <= Keys.Z; k++)
{
  if (KeyPress(k))
  {
      if (keyboardState.IsKeyDown(Keys.LeftShift) || keyboardState.IsKeyDown(Keys.RightShift)) //if shift is held down
          Text += k.ToString().ToUpper(); //convert the Key enum member to uppercase string
      else
          Text += k.ToString().ToLower(); //convert the Key enum member to lowercase string
  }
}
[...]