C#:有没有办法正确转换Keys.Oem?没有做字符串操作的正确字符串?

时间:2009-04-09 23:55:34

标签: c# .net

C#:有没有转换Keys.Oem的方法?没有做字符串操作的正确字符串?

当我执行e.ToString()并且密钥是/或<等等时,它将转换为OemSlash,OemQuestion。有没有一种方法.net方法正确地将Keys.OemSpace转换为“Space”而不包括“OemSpace”并且没有字符串操作?如果没有内置方法来做这样的事情,那么最好的方法是什么呢?

3 个答案:

答案 0 :(得分:2)

如果要确定使用给定修饰符从给定键获得的字符,则应使用user32 ToAscii函数。或ToAsciiEx如果您想使用键盘布局其他,那么就是当前的。

using System.Runtime.InteropServices;
public static class User32Interop
{
  public static char ToAscii(Keys key, Keys modifiers)
  {
    var outputBuilder = new StringBuilder(2);
    int result = ToAscii((uint)key, 0, GetKeyState(modifiers),
                         outputBuilder, 0);
    if (result == 1)
      return outputBuilder[0];
    else
      throw new Exception("Invalid key");
  }

  private const byte HighBit = 0x80;
  private static byte[] GetKeyState(Keys modifiers)
  {
    var keyState = new byte[256];
    foreach (Keys key in Enum.GetValues(typeof(Keys)))
    {
      if ((modifiers & key) == key)
      {
        keyState[(int)key] = HighBit;
      }
    }
    return keyState;
  }

  [DllImport("user32.dll")]
  private static extern int ToAscii(uint uVirtKey, uint uScanCode,
                                    byte[] lpKeyState,
                                    [Out] StringBuilder lpChar,
                                    uint uFlags);
}

您现在可以像这样使用它:

char c = User32Interop.ToAscii(Keys.OemQuestion, Keys.ShiftKey); // = '?'

如果您需要多个修饰符,只需or个。 Keys.ShiftKey | Keys.AltKey

答案 1 :(得分:0)

我能想到的唯一方法是使用正则表达式。我知道这不是你可能想要的答案。希望有人知道这样做的方法。

答案 2 :(得分:0)

您可能希望使用ToAsciiToUnicode函数,这是Win32 API的一部分。 (我怀疑你是否会得到一个简单的纯BCL /跨平台解决方案,如果这就是你想要的。)它们是相对简单的功能,可以将虚拟键码转换为字符(以ASCII或Unicode编码,作为名称)建议)。

修改:我认为您可能真的对KeysConverter课程感到满意!