如何将字符转换为等效的System.Windows.Input.Key枚举值?

我想写这样的function,

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

我知道我可以写一个巨大的开关箱来匹配angular色,但是有没有其他方法? 与此有关的是Key枚举的string可能与字符不匹配,所以Enum.IsDefined将不起作用

有任何想法吗?

更新:这是在Windows环境中

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

尝试使用System.Windows.Input.KeyConverter类的ConvertFrom方法。

嗨只要转换这种方式

 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) 

在我的情况下,我按下我的键盘上的“input”, O进入ENTER {13}和ChValue进入字符代码13对于TAB键我会收到字符代码9 ,例如。

最近我发现了Jon Hanna也能处理关键状态的类似问题的一个很好的答案 :

这个例子可能比其他的例子更容易解释:

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

输出:

 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 

(尽pipe你自己的控制台可能会根据设置和字体的不同而弄乱和/或é)。

阅读参考答案的完整描述