2009-04-08 7 views
3

Si je sais qu'une certaine touche a été pressée (par exemple Key.D3), et que la clé est également en baisse Shift (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)), comment puis-je savoir quel personnage qui fait référence à (par exemple, # sur le clavier américain, UK livre signe sur le clavier UK, etc)?Mapping clavier dans .NET

Autrement dit, comment puis-je savoir, programatically, que Maj + produit # (il ne serait pas sur un clavier non-US).

+0

Mis à jour ma réponse avec la solution, à la vôtre. – Samuel

Répondre

7

Si vous voulez déterminer quel caractère vous obtiendrez d'une clé donnée avec des modificateurs donnés, vous devez utiliser la fonction user32 ToAscii. Ou ToAsciiEx si vous souhaitez utiliser une disposition de clavier autre puis l'actuelle.

using System.Runtime.InteropServices; 
public static class User32Interop 
{ 
    public static char ToAscii(Keys key, Keys modifiers) 
    { 
    var outputBuilder = new StringBuilder(2); 
    int result = ToAscii((uint)key, 0, GetKeyState(modifiers), 
         outputBuilder, 0); 
    if (result == 1) 
     return outputBuilder[0]; 
    else 
     throw new Exception("Invalid key"); 
    } 

    private const byte HighBit = 0x80; 
    private static byte[] GetKeyState(Keys modifiers) 
    { 
    var keyState = new byte[256]; 
    foreach (Keys key in Enum.GetValues(typeof(Keys))) 
    { 
     if ((modifiers & key) == key) 
     { 
     keyState[(int)key] = HighBit; 
     } 
    } 
    return keyState; 
    } 

    [DllImport("user32.dll")] 
    private static extern int ToAscii(uint uVirtKey, uint uScanCode, 
            byte[] lpKeyState, 
            [Out] StringBuilder lpChar, 
            uint uFlags); 
} 

Vous pouvez l'utiliser comme ceci:

char c = User32Interop.ToAscii(Keys.D3, Keys.ShiftKey); // = '#' 

Si vous avez besoin de plus d'un modificateur, juste or eux. Keys.ShiftKey | Keys.AltKey

+0

Oui, mais POURQUOI? (Ne réponds pas à ça). Comment puis-je savoir, par programmation, que Shift + Key.D3 produit '#' (ce n'est pas le cas sur un clavier non américain). –

+0

Oh, vous devriez peut-être affiner votre question pour clarifier ce point. – Samuel

+0

J'ai trouvé une solution, laissez-moi changer la réponse – Samuel