Код клавиши для @ char - PullRequest
       28

Код клавиши для @ char

1 голос
/ 19 декабря 2009

Может кто-нибудь сказать мне идентификатор для @ ключа?

, например, keys.Escape для клавиши ESC. я хотел бы знать, что это за @

спасибо.

Ответы [ 4 ]

5 голосов
/ 19 декабря 2009

Код KeyCode - это то, что вы получаете в событиях KeyDown и KeyUp . Поскольку это сдвинутый символ, это зависит от раскладки клавиатуры. Насколько я знаю, большинство клавиатур имеют значение выше цифры 2, а это означает, что нужно проверить e.Shift && e.KeyCode == Keys.D2 (WinForms). Но на некоторых большинстве международных клавиатур это не будет работать.

Но учтите, что обработка события KeyPress гораздо надежнее: e.KeyChar == '@'

Редактировать: Я быстро взглянул на эту страницу , и большинство международных клавиатур имеют " над клавишей 2 и используют Alt-что-то, чтобы получить @.

2 голосов
/ 19 декабря 2009

Не следует использовать событие KeyDown для распознавания клавиш ввода, таких как @. Перевод кода виртуальной клавиши (KeyEventArgs.KeyData) в клавишу ввода зависит от раскладки клавиатуры. Что, вероятно, отличается в Великобритании от того, что в США, вам нужно куда-то втиснуть фунт. И, безусловно, отличается от клавиатуры в дальнем востоке.

Вместо этого используйте событие KeyPressed.

2 голосов
/ 19 декабря 2009

На моей клавиатуре это Keys.D2, потому что @ - это та же клавиша, что и цифра 2.

Однако если вы обрабатываете событие KeyPress, вы получаете KeyPressEventArgs в аргументе, который имеет KeyPressEventArgs.KeyChar свойство . И это свойство содержит символ, а не код клавиши.

0 голосов
/ 17 мая 2015

Сначала вам понадобится класс для переноса вызовов ОС, необходимых для проверки раскладки клавиатуры:

public class KeyboardPointer : IDisposable
{
  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  static extern short VkKeyScanEx(char ch, IntPtr dwhkl);
  [DllImport("user32.dll")]
  static extern bool UnloadKeyboardLayout(IntPtr hkl);
  [DllImport("user32.dll")]
  static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
  private readonly IntPtr pointer;
  public KeyboardPointer(int klid)
  {
    pointer = LoadKeyboardLayout(klid.ToString("X8"), 1);
  }
  public KeyboardPointer(CultureInfo culture)
    :this(culture.KeyboardLayoutId){}
  public void Dispose()
  {
    UnloadKeyboardLayout(pointer);
    GC.SuppressFinalize(this);
  }
  ~KeyboardPointer()
  {
    UnloadKeyboardLayout(pointer);
  }
  public bool GetKey(char character, out Keys key)
  {
    short keyNumber = VkKeyScanEx(character, pointer);
    if(keyNumber == -1)
    {
      key = Keys.None;
      return false;
    }
    key = (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) << 8) | (keyNumber & 0xFF));
    return true;
  }
}

Тогда, если вы запустите:

Keys atKey;
bool hasAtKey;
using(var keyboard = new KeyboardPointer(CultureInfo.CurrentCulture))
  hasAtKey = keyboard.GetKey('@', out atKey);

hasAtKey будет истинным, если клавиатура имеет комбинацию клавиш для @, в этом случае atKey будет содержать соответствующее значение, в то время как в противном случае она будет содержать Keys.None.

Например, когда я запускаю его, тогда atKey содержит значение Keys.Oemtilde | Keys.Shift, но если я изменяю код для передачи в CultureInfo.GetCultureInfo("en-US"), оно содержит Keys.D2 | Keys.Shift.

Как вы можете видеть, KeyboardPointer написан так, чтобы принимать как культуру, так и числовой идентификатор, чтобы вы не ограничивались основной клавиатурой для культуры, а также другими макетами, используемыми с ней, такими как макеты Dvorak и т. Д. 1020 *

Все вышеперечисленное использует вызовы функций Windows32 в Windows, поэтому на других платформах потребуется другой подход.

...