Cómo convertir un carácter en el valor equivalente de System.Windows.Input.Key Enum?

Quiero escribir una función como tal,

public System.Windows.Input.Key ResolveKey(char charToResolve) { // Code goes here, that resolves the charToResolve // in to the Key enumerated value // (For example with '.' as the character for Key.OemPeriod) } 

Sé que puedo escribir un gran Switch-case para que coincida con el personaje, pero ¿hay alguna otra manera? Lo que pasa con esto es que la cadena de la clave Enum puede no coincidir con el carácter, por lo que Enum.IsDefined no funcionará

¿Algunas ideas?

Actualización: esto está en el entorno de Windows

 [DllImport("user32.dll")] static extern short VkKeyScan(char ch); static public Key ResolveKey(char charToResolve) { return KeyInterop.KeyFromVirtualKey(VkKeyScan(charToResolve)); } 

Intente utilizar el método ConvertFrom de la clase System.Windows.Input.KeyConverter.

Hola, solo conviértete de esa manera

 Dim KeyConverter As New Forms.KeysConverter Dim S As String = KeyConverter.ConvertToString(e.Key) Dim O As System.Windows.Forms.Keys = KeyConverter.ConvertFrom(S) Dim ChValue As Integer = CType(O, Integer) 

En mi caso, presiono “ENTER” en mi teclado, O ingresa ENTER {13} y ChValue ingresa en el Código de caracteres 13 Para la tecla TAB , recibiré el Código de caracteres 9 esa manera, por ejemplo.

Recientemente encontré una gran respuesta para una pregunta similar de Jon Hanna que también puede manejar estados clave de control:

Este podría explicarse más fácilmente con un progtwig de ejemplo que con cualquier otra cosa:

 namespace KeyFinder { class Program { [DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern short VkKeyScanEx(char ch, IntPtr dwhkl); [DllImport("user32.dll")] static extern bool UnloadKeyboardLayout(IntPtr hkl); [DllImport("user32.dll")] static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags); public class KeyboardPointer : IDisposable { private readonly IntPtr pointer; public KeyboardPointer(int klid) { pointer = LoadKeyboardLayout(klid.ToString("X8"), 1); } public KeyboardPointer(CultureInfo culture) :this(culture.KeyboardLayoutId){} public void Dispose() { UnloadKeyboardLayout(pointer); GC.SuppressFinalize(this); } ~KeyboardPointer() { UnloadKeyboardLayout(pointer); } // Converting to System.Windows.Forms.Key here, but // some other enumerations for similar tasks have the same // one-to-one mapping to the underlying Windows API values public bool GetKey(char character, out Keys key) { short keyNumber = VkKeyScanEx(character, pointer); if(keyNumber == -1) { key = System.Windows.Forms.Keys.None; return false; } key = (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) < < 8) | (keyNumber & 0xFF)); return true; } } private static string DescribeKey(Keys key) { StringBuilder desc = new StringBuilder(); if((key & Keys.Shift) != Keys.None) desc.Append("Shift: "); if((key & Keys.Control) != Keys.None) desc.Append("Control: "); if((key & Keys.Alt) != Keys.None) desc.Append("Alt: "); return desc.Append(key & Keys.KeyCode).ToString(); } public static void Main(string[] args) { string testChars = "Aéש"; Keys key; foreach(var culture in (new string[]{"he-IL", "en-US", "en-IE"}).Select(code => CultureInfo.GetCultureInfo(code))) { Console.WriteLine(culture.Name); using(var keyboard = new KeyboardPointer(culture)) foreach(char test in testChars) { Console.Write(test); Console.Write('\t'); if(keyboard.GetKey(test, out key)) Console.WriteLine(DescribeKey(key)); else Console.WriteLine("No Key"); } } Console.Read();//Stop window closing } } } 

Salida:

 he-IL A Shift: A é No Key ש A en-US A Shift: A é No Key ש No Key en-IE A Shift: A é Control: Alt: E ש No Key 

(Aunque su propia consola puede arruinar ש y / o é dependiendo de la configuración y las fonts).

Lea las descripciones completas de la respuesta a la que se hace referencia