在XNA中正确获取聊天按键

在XNA中正确获取聊天按键,xna,keyboard-events,Xna,Keyboard Events,所以,我要直截了当地说,我正在制作一个XNA游戏中的聊天系统。我可以很容易地找出按下了哪些键,但我无法知道实际键入的是什么。在我看来,他们好像在说:oemshift你好,比尔oemshift你好吗。你好吗?(或者类似的话) 处理所有这些的最佳方法是什么?所以我使用的简单解决方案是获得一个Win32键盘的钩子,并让windows翻译正在键入的任何内容。它在我的另一台电脑上,但它基本上是在我的电脑上使用这个解决方案。(职位编号#10) 令人敬畏的是,如果您使用[DllImport(“user32.d

所以,我要直截了当地说,我正在制作一个XNA游戏中的聊天系统。我可以很容易地找出按下了哪些键,但我无法知道实际键入的是什么。在我看来,他们好像在说:
oemshift你好,比尔oemshift你好吗。你好吗?
(或者类似的话)


处理所有这些的最佳方法是什么?

所以我使用的简单解决方案是获得一个Win32键盘的钩子,并让windows翻译正在键入的任何内容。它在我的另一台电脑上,但它基本上是在我的电脑上使用这个解决方案。(职位编号#10)

令人敬畏的是,如果您使用
[DllImport(“user32.dll”,CharSet=CharSet.Unicode)]
(所有.dll导入中的字符集部分),您可以从键盘获得本地化输入

把它放在某个地方,在Initialize中注册事件,就这样!希望对你有用

编辑
整个Win32业务可能看起来很吓人,但不要因此而停止使用它-这只是复制粘贴的问题,您可以在2分钟内完全运行它。

我猜您是通过
keyState.GetPressedKeys()查询键盘输入。

您必须在代码中的某个地方使用
switch
语句将
键的成员映射到实际字符。
ToString()
方法适用于字母,但不适用于符号,因为它们是由名称指定的

switch (keyPressed)
{
    case Keys.OemPeriod :
        character = '.';
        break;
    case Keys.OemQuestion :
        character = '?';
        break;

    // More cases
}

不过要小心,因为键盘是不同的。正如您正确指出的:钥匙!=象征。其他硬件上的某些键可能与完全不同的符号相关联

对于PC来说,XNA框架中没有内置任何东西可以让它变得简单(WP7和Xbox的情况不同)

这篇文章很好地总结了你所有的选择

基本上

  • 构建一个具有字符到按键映射的大型字典
  • 钩入XNA游戏的形式键下,键上,按键事件
  • 使用IMessageFilter接口
  • 使用SetWindowsHookEx获取关键事件
  • 每种方法都有各自的优缺点,本文作者提供了一个可以下载的示例

    在做一些研究时,我还从Nuclex的人那里找到了一个图书馆。他们通常会创建相当健壮的解决方案,因此也绝对值得一试


    需要记住的重要一点是,你在电脑上,任何一个库都可以使用(通过一些修改/调整)。所以不要局限于只看XNA相关的样本。DirectInput、SlimDX、SharpDX等的示例也是可选的,它们可能需要一些额外的工作才能加入到您的项目中。

    您希望在WP7、Xbox或PC上完成此操作吗?@George oh,对不起,忘了提一下。这都是基于PC的。