C#:有没有办法正确转换密钥。Oem?在不进行字符串操作的情况下创建正确的字符串?

C#:有没有办法正确转换密钥。Oem?在不进行字符串操作的情况下创建正确的字符串?,c#,.net,C#,.net,C#:是否有转换键的方法。Oem?在不进行字符串操作的情况下创建正确的字符串 当我执行e.ToString()时,如果键是a/或,我能想到的唯一方法就是使用正则表达式。我知道这不是你想要的答案。希望有人知道执行此操作的方法。您可能希望使用or函数,这是Win32 API的一部分。(如果你想要的话,我怀疑你是否会得到一个简单的纯BCL/跨平台解决方案。)它们是相对简单的函数,可以将虚拟密钥代码转换为字符(如名称所示,可以是ASCII或Unicode编码) 编辑:我想你在这门课上可能真的很幸运 如果

C#:是否有转换键的方法。Oem?在不进行字符串操作的情况下创建正确的字符串


当我执行e.ToString()时,如果键是a/或,我能想到的唯一方法就是使用正则表达式。我知道这不是你想要的答案。希望有人知道执行此操作的方法。

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


编辑:我想你在这门课上可能真的很幸运

如果要确定使用给定修饰符从给定键获得的字符,应使用函数。或者,如果要使用当前布局以外的键盘布局

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); // = '?'

如果您需要多个修饰符,只需
它们即可
Keys.ShiftKey | Keys.AltKey

KeysConverter似乎几乎毫无用处。Keys.D3 | Keys.Shift生成“Shift+3”。是的,所以这不是需要的。我将删除它并保留帖子的原始部分。