2009-02-13 18 views
15

Quiero escribir una función como tal,Cómo convertir un carácter en el valor equivalente de System.Windows.Input.Key Enum?

 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 enorme switch de los casos 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á

¿Alguna idea?

Actualización: Esta se encuentra en entorno Windows

+0

Cuál es el ambiente? winforms/asp.net? ¿Cuál es el propósito de hacer tal cosa? – shahkalpesh

Respuesta

23
[DllImport("user32.dll")] 
static extern short VkKeyScan(char ch); 

static public Key ResolveKey(char charToResolve) 
{ 
    return KeyInterop.KeyFromVirtualKey(VkKeyScan(charToResolve)); 
}
+1

'VkKeyScan()' usa el byte alto para codificar los estados de la tecla modificadora, por lo que esto falla para las letras mayúsculas porque 'VkKeyScan()' se agrega en el indicador de cambio. Si usted y el valor de retorno de 'VkKeyScan()' con '0xFF' para borrar esos indicadores funcionará con letras mayúsculas. – shf301

7

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

+0

no funciona con '.' – Avram

+0

Esto no debe usarse de esa manera. Echa un vistazo en Reflector y verás que solo admite letras, dígitos y algunas otras teclas. Las excepciones notables incluyen?, Que necesitaría ser la cadena "OemQuestion" para convertirse correctamente. – OwenP

1

Hola Sólo convertir 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 me presiona "Enter" en mi teclado, O va en ENTER {13} y ChValue va en códigos de caracteres 13 Para TAB clave que lo haré recibir código de carácter 9 de esa manera, por ejemplo.

1

Recientemente he encontrado una gran answer for similar question from Jon Hanna que puede manejar los estados clave de control, así:

Ésta podría explicarse más fácilmente con un programa de ejemplo que 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 

(A pesar de su propia consola de poder meter la pata ש y/o E dependiendo de la configuración y fuentes).

leer las descripciones completas de referenced answer

Cuestiones relacionadas