将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; }