Come convertire un carattere in un valore Enum System.Windows.Input.Key equivalente?

Voglio scrivere una funzione come questa,

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) } 

So di poter scrivere un’enorme Switch-case per abbinarla al personaggio, ma esiste un altro modo? Il problema è che la stringa di Key enum potrebbe non corrispondere al carattere, quindi Enum.IsDefined non funzionerà

Qualche idea?

Aggiornamento: questo è in ambiente Windows

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

    Prova a utilizzare il metodo ConvertFrom della class System.Windows.Input.KeyConverter.

    Ciao, convertitevi in ​​questo modo

     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) 

    Nel mio caso premo “INVIO” sulla mia tastiera, O sta entrando in ENTER {13} e ChValue sta entrando in Codice carattere 13 Per il TAB ad esempio, riceverò il Codice carattere 9 questo modo.

    Recentemente ho trovato un’ottima risposta per una domanda simile di Jon Hanna che può gestire anche gli stati dei control key:

    Questo potrebbe essere più facilmente spiegato con un programma di esempio di qualsiasi altra 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 } } } 

    Produzione:

     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 

    (Anche se la tua console potrebbe rovinare ש e / o é a seconda delle impostazioni e dei font).

    Leggi le descrizioni complete dalla risposta di riferimento