将keycode转换为char / string

我正在尝试使用以下命令将System.Windows.Forms.Keys转换为字符串/ char:

 KeysConverter converter = new KeysConverter(); string text = converter.ConvertToString(keyCode); Console.WriteLine(text); 

但它为“。”返回了“OemPeriod”。 和“Oemcomma”代表“,”。 有没有办法得到确切的角色?

这可能是你真正想要的(有点迟了,但希望这会帮助其他人),将键码直接转换为键打印的字符。

首先将此指令添加到您的类中:

 [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int ToUnicode( uint virtualKeyCode, uint scanCode, byte[] keyboardState, StringBuilder receivingBuffer, int bufferSize, uint flags ); 

如果您只想忽略shift修改器,请使用此选项

 StringBuilder charPressed = new StringBuilder(256); ToUnicode((uint)keyCode, 0, new byte[256], charPressed, charPressed.Length, 0); 

现在只需调用charPressed.ToString()来获取密钥。

如果你想要移位修改器,你可以使用这样的东西来使它更容易

 static string GetCharsFromKeys(Keys keys, bool shift) { var buf = new StringBuilder(256); var keyboardState = new byte[256]; if (shift) { keyboardState[(int)Keys.ShiftKey] = 0xff; } ToUnicode((uint)keys, 0, keyboardState, buf, 256, 0); return buf.ToString(); } 

无论如何,你想要实现的目标并非无足轻重。 Windows(例如)使用键盘映射(键盘布局)将键盘键转换为实际字符。 以下是我能够实现这一目标的方法:

 public string KeyCodeToUnicode(Keys key) { byte[] keyboardState = new byte[255]; bool keyboardStateStatus = GetKeyboardState(keyboardState); if (!keyboardStateStatus) { return ""; } uint virtualKeyCode = (uint)key; uint scanCode = MapVirtualKey(virtualKeyCode, 0); IntPtr inputLocaleIdentifier = GetKeyboardLayout(0); StringBuilder result = new StringBuilder(); ToUnicodeEx(virtualKeyCode, scanCode, keyboardState, result, (int)5, (uint)0, inputLocaleIdentifier); return result.ToString(); } [DllImport("user32.dll")] static extern bool GetKeyboardState(byte[] lpKeyState); [DllImport("user32.dll")] static extern uint MapVirtualKey(uint uCode, uint uMapType); [DllImport("user32.dll")] static extern IntPtr GetKeyboardLayout(uint idThread); [DllImport("user32.dll")] static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl); 

因为你的问题标签中有“console-application”,试试这个

  ConsoleKeyInfo input = Console.ReadKey(true); StringBuilder output = new StringBuilder( String.Format("You pressed {0}", input.KeyChar)); Console.WriteLine(output.ToString()); 

这些是键盘上逗号和句点键的正确名称和预期名称。 您可以从文档中清楚地看到。 KeysConverter类的行为符合预期和设计。

如果您想为这些键提供不同的名称,您可以检测它们并替换您想要使用的名称。 例如:

 string name; switch (e.KeyCode) { case Keys.Oemcomma: name = "Comma"; break; case Keys.OemPeriod: name = "Period"; break; default: name = (new KeysConverter()).ConvertToString(e.KeyCode); break; }