2009-02-13 31 views
15

Tôi muốn viết một hàm như vậy,Làm thế nào để chuyển đổi một ký tự thành giá trị tương đương 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) 

     } 

Tôi biết tôi có thể viết một Switch hợp cụ thể rất lớn để phù hợp với nhân vật, nhưng là có cách nào khác? Điều này là chuỗi của Key enum có thể không khớp với ký tự sao cho Enum.IsDefined sẽ không hoạt động

Bất kỳ ý tưởng nào?

Cập nhật: Đây là trong môi trường Windows

+0

môi trường là gì? winforms/asp.net? Mục đích của việc làm như vậy là gì? – shahkalpesh

Trả lời

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

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

'VkKeyScan()' sử dụng byte cao để mã hóa các trạng thái khóa của trình sửa đổi, vì vậy điều này không thành công cho chữ hoa vì 'VkKeyScan()' thêm vào cờ thay đổi. Nếu bạn và giá trị trả về của 'VkKeyScan()' với '0xFF' để xóa các cờ đó, nó sẽ hoạt động với các chữ in hoa. – shf301

7

Hãy thử sử dụng các phương pháp ConvertFrom của lớp System.Windows.Input.KeyConverter.

+0

không hoạt động với '.' – Avram

+0

Điều này không có nghĩa là được sử dụng theo cách đó. Hãy nhìn vào nó trong Reflector và bạn sẽ thấy nó chỉ hỗ trợ chữ cái, chữ số, và một vài phím khác. Ngoại lệ đáng chú ý bao gồm?, Mà sẽ cần phải là chuỗi "OemQuestion" để có được chuyển đổi đúng cách. – OwenP

1

Hi Chỉ cần chuyển đổi như vậy

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) 

Trong trường hợp của tôi, tôi nhấn "ENTER" trên bàn phím của tôi, O là đi sâu vào ENTER {13} và ChValue là đi sâu vào nhân vật Mã 13 Đối TAB chính tôi sẽ nhận mã ký tự 9 theo cách đó chẳng hạn.

1

Gần đây tôi tìm thấy một lớn answer for similar question from Jon Hanna mà có thể xử lý kiểm soát các bang trọng yếu cũng như:

một này có thể được dễ dàng hơn giải thích với một chương trình ví dụ hơn bất cứ điều gì khác:

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

Đầu ra:

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 

(Mặc dù riêng console sức lộn xộn của bạn lên ש và/hoặc é tùy thuộc vào thiết lập và phông chữ).

Đọc mô tả đầy đủ từ referenced answer

Các vấn đề liên quan