How to convert a character in to equivalent System.Windows.Input.Key Enum value?

前端 未结 4 1320
暗喜
暗喜 2020-11-28 15:58

I want to write a function like so,

        public System.Windows.Input.Key ResolveKey(char charToResolve)
        {
            // Code goes here, that reso         


        
相关标签:
4条回答
  • Hi Just convert that way

    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) 
    

    In my case I press "ENTER" on my keyboard, O is going into ENTER {13} and ChValue is going into Character Code 13 For TABKey I will receive Character Code 9 that way for example.

    0 讨论(0)
  • 2020-11-28 16:20
    [DllImport("user32.dll")]
    static extern short VkKeyScan(char ch);
    
    static public Key ResolveKey(char charToResolve)
    {
        return KeyInterop.KeyFromVirtualKey(VkKeyScan(charToResolve));
    }
    0 讨论(0)
  • 2020-11-28 16:25

    Recently I found a great answer for similar question from Jon Hanna which can handle control key states as well:

    This one might be more easily explained with an example program than anything else:

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

    Output:

    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
    

    (Though your own console might mess up ש and/or é depending on settings and fonts).

    Read full descriptions from referenced answer

    0 讨论(0)
  • 2020-11-28 16:34

    Try using the ConvertFrom method of the System.Windows.Input.KeyConverter class.

    0 讨论(0)
提交回复
热议问题