Отображение клавиатуры в .NET - PullRequest
4 голосов
/ 08 апреля 2009

Если я знаю, что определенная клавиша была нажата (например, Key.D3), и что клавиша Shift также нажата (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)), как я могу узнать, какой символ относится к (например, # на клавиатуре США, знак британского фунта на клавиатуре Великобритании и т. д.)?

Другими словами, как программно узнать, что Shift + 3 производит # (это было бы не на клавиатуре не из США) ).

1 Ответ

8 голосов
/ 08 апреля 2009

Если вы хотите определить, какой символ вы получите от данного ключа с заданными модификаторами, вам следует использовать функцию user32 ToAscii. Или ToAsciiEx, если вы хотите использовать раскладку клавиатуры other , тогда текущую.

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

Теперь вы можете использовать его так:

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

Если вам нужно более одного модификатора, просто or. Keys.ShiftKey | Keys.AltKey

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...