2011-01-27 69 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