Обнаружение типа клавиатуры (Qwerty или Dvorak)

Этот вопрос мне задал друг, и это пробудило мое любопытство, и я пока не смог найти решение, поэтому надеюсь, что кто-то узнает.

Есть ли способ программно определить, какой тип клавиатуры использует пользователь? Насколько я понимаю, клавиатура состоит в том, что сигнал, посылаемый на компьютер для обозначения "A" на клавиатуре DVORAK, совпадает с сигналом, посылаемым на компьютер для обозначения "A" на клавиатуре QUERTY. Тем не менее, я читал о способах переключения на / с dvorak, которые выделяют настройки реестра, но я надеюсь, что есть настройки компьютера или что-то еще, что я могу запросить.

Есть идеи?

4 ответа

Решение

Вы можете сделать это, вызвав метод Win32 API GetKeyboardLayoutName(). Клавиатуры Дворжака имеют конкретные названия. Например, американский макет Dvorak имеет имя 00010409.

Фрагмент кода:

  public class Program
  {
    const int KL_NAMELENGTH = 9;

    [DllImport("user32.dll")]
    private static extern long GetKeyboardLayoutName(
          System.Text.StringBuilder pwszKLID); 

    static void Main(string[] args)
    {
      StringBuilder name = new StringBuilder(KL_NAMELENGTH);

      GetKeyboardLayoutName(name);

      Console.WriteLine(name);

    }
  }

Вы могли бы сделать это через DirectInput или любой другой текущий DirectX-эквивалент. Я набираю на клавиатуре Dvorak, и около 50% игр, которые я покупаю, обнаруживают мою клавиатуру и реконфигурируют раскладки клавиш по умолчанию для ее поддержки (например, используя aoe вместо wasd)

И да, как отметил Брайан, "А" одинаково на обеих клавиатурах.

Это, вероятно, зависит от ОС. Я уверен, что где-то есть настройка операционной системы, которая регистрирует национальность клавиатуры. (Дворжак считается национальностью, потому что французские клавиатуры отличаются от американских, клавиатуры отличаются от...)

Кроме того, примечание: "A" был плохим примером, поскольку "A" - это один и тот же ключ в dvorak и qwerty... B-)

Почему это имеет значение? В зависимости от какой-то особой реализации клавиатуры это не очень хорошая идея. Мы используем сканеры штрих-кода повсюду, которые эмулируют ввод с клавиатуры. Что бы ваша программа сделала с этими устройствами?:)

PS: упомянутая запись реестра размещает клавиши обычной клавиатуры в раскладку дворака.

Другие вопросы по тегам