2011-01-27 18 views

回答

3
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 bool GetKeyboardState(byte[] lpKeyState); 
    [DllImport("user32.dll")] 
    public static extern uint MapVirtualKey(uint uCode, MapType uMapType); 
    [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); 

    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

並非所有的KeyDown事件都對應一個可見的字符 - 例如Backspace和Enter。您必須將事件arg的內容與您想要關聯的內容進行比較。例如,在我的美國QUERTY鍵盤上,左上角的按鍵是反撥號,但它可能看起來像別的鍵盤。

+0

我是知道的。我只是在尋找類似於WinForm的KeyPress事件。提供角色的東西(如果可用)。我發現了一個工作,儘管很麻煩。 – Jordan 2011-01-27 15:40:57

2

試試這個:

var virtualKey = (uint)KeyInterop.VirtualKeyFromKey(e.Key); 
var keyCode = MapVirtualKey(virtualKey, 0); 

導入功能MapVirtualKey

[DllImport("user32.dll")] 
static extern uint MapVirtualKey(uint uCode, uint uMapType); 
0
private void UserControl1_KeyDown_1(object sender, KeyEventArgs e) 
{ 
    FieldInfo field = e.GetType().GetField 
    (
     "_scanCode", 
     BindingFlags.NonPublic | 
     BindingFlags.Instance 
    ); 

    Int32 scancode = (Int32)field.GetValue(e); 

    char c = (char)scancode; 
} 
+0

這段代碼的一些解釋很好。 – 2012-10-02 12:32:15