2011-04-28 35 views
24

我的WPF應用程序處理鍵盤按鍵,特別是#和*字符,因爲它是一個VoIP電話。如何捕獲WPF/C#中不同語言環境鍵盤上的'#'字符?

雖然國際鍵盤,特別是英國英語鍵盤,我有一個錯誤。通常我聽3鍵,如果換檔鍵修改器關閉,我們就開始做一些事情。然而在英國鍵盤上這是'£'字符。我發現英國的英文鍵盤上有'#'專用鍵。顯然,我們可以只聽那個特定的鍵,但這並不能解決美國英語是shift-3的問題,所有無數其他鍵盤都將它放在其他地方。

長話短說,我如何從按鍵聽某個特定角色,無論是關鍵組合還是單鍵並對其作出反應?

回答

52

下面的函數,GetCharFromKey(Key key)會做的。

它採用了一系列的Win32調用來解碼按下的鍵:

  1. 得到virtual key from WPF key

  2. 得到scan code from the virtual key

  3. 得到your unicode character

old post更詳細地描述了它。

 public enum MapType : uint 
     { 
     MAPVK_VK_TO_VSC = 0x0, 
     MAPVK_VSC_TO_VK = 0x1, 
     MAPVK_VK_TO_CHAR = 0x2, 
     MAPVK_VSC_TO_VK_EX = 0x3, 
     } 

     [DllImport("user32.dll")] 
     public static extern int ToUnicode(
      uint wVirtKey, 
      uint wScanCode, 
      byte[] lpKeyState, 
      [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
      StringBuilder pwszBuff, 
      int cchBuff, 
      uint wFlags); 

     [DllImport("user32.dll")] 
     public static extern bool GetKeyboardState(byte[] lpKeyState); 

     [DllImport("user32.dll")] 
     public static extern uint MapVirtualKey(uint uCode, MapType uMapType); 

     public static char GetCharFromKey(Key key) 
     { 
     char ch = ' '; 

     int virtualKey = KeyInterop.VirtualKeyFromKey(key); 
     byte[] keyboardState = new byte[256]; 
     GetKeyboardState(keyboardState); 

     uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC); 
     StringBuilder stringBuilder = new StringBuilder(2); 

     int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0); 
     switch (result) 
     { 
      case -1: 
       break; 
      case 0: 
       break; 
      case 1: 
       { 
        ch = stringBuilder[0]; 
        break; 
       } 
      default: 
       { 
        ch = stringBuilder[0]; 
        break; 
       } 
     } 
     return ch; 
     } 
+0

我一直在使用這一段時間,並注意到一個錯誤。兩個鍵從GetCharFromKey返回相同的結果。要驗證,只需簡單地爲TextBox創建子類,重寫PreiewKeyDown,敲擊空格鍵(它是32個字符),然後觸擊Delete鍵,同時返回32個字符。有沒有人看到這個? – gcadmes 2013-06-04 13:40:48

+0

那真是令人h噓...... GetCharFromKey中的第一條語句是char ch ='';。因此,對於落入'0'或'1'的情況,返回字符總是空格(char)32。 (前額一巴掌) – gcadmes 2013-06-04 15:48:32

+3

對於不生成文本字符的鍵或者((char?)null),它確實應該返回''\ 0''。 – jnm2 2014-05-19 13:37:06

相關問題