Справочник по C#

    Исходники по языку программирования CSharp

    Проверка раскладки клавиатуры: Справочник по C#

    /
    /
    /
    291 Views


          Данная инструкция поможет вам реализовать проверку раскладки клавиатуры в режиме реального времени по стандарту «ISO 639-1:2002» и трехбуквенный код, определенный в формате Windows API.
          Создайте проект Windows Form в Microsoft Visual Studio. Добавьте на главную форму вашего проекта два компонента:
    • Label– Для вывода состояния раскладки клавиатуры;
    • Timer – Для запуска проверки состояния клавиатуры через определенный интервал времени.

    У вас получится приведенный ниже пример.

          Выберете компонент «Timer», который вы добавили на главную форму вашего проекта. Сделайте клик правой клавишей мыши по нему и выберите из появившегося контекстного меню, пункт «Свойства».

    Выставьте в свойствах компонента, следующие параметры:

    ПараметрЗначениеОписание
    EnabledTrueЗапуск таймера, при старте вашей программы
    Interval1000Интервал проверки, раскладки клавиатуры, равный одной секунде

          Перейдите в листинг вашего проекта, нажав на клавиатуре, клавишу «F7». Для работы с раскладкой клавиатуры, воспользуемся некоторыми функциями из библиотеки «user32.dll». Добавьте приведенные ниже функции, в листинг вашего проекта.

    •       Функция GetKeyboardLayout извлекает данные об активном идентификаторе языка ввода (прежде называемом раскладкой символов на клавиатуре) для заданного потока. Если параметр idThread нулевой, возвращается идентификатор языка ввода для активного потока.
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern IntPtr GetKeyboardLayout(int WindowsThreadProcessID);
    •       Функция GetWindowThreadProcessId возвращает обратно идентификатор потока, который создал определяемое окно, но необязательно идентификатор процесса, который создал это окно.
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern int GetWindowThreadProcessId(IntPtr handleWindow, out int lpdwProcessID);
    •       Функция GetForegroundWindow возвращает дескриптор приоритетного окна (окна, с которым пользователь в настоящее время работает). Система присваивает немного более высокий приоритет потоку, который создает приоритетное окно, чем тот, который она дает другим потокам.
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern IntPtr GetForegroundWindow();

          Для работы необходимо объявить несколько статических переменных.

    • «_InstalledInputLanguages» класса InputLanguageCollection, данный класс хранит объекты класса InputLanguage, который предоставляет методы и поля для управления языком ввода.
    private static InputLanguageCollection _InstalledInputLanguages;
    • «_ProcessId» – идентификатор активного потока.
    private static int _ProcessId;
    • «_CurrentInputLanguage» – строковая переменная текущего языка ввода.
    private static string _CurrentInputLanguage;
          Модификатор static используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту. Модификатор static можно использовать с классами, полями, методами, свойствами, операторами, событиями и конструкторами, но нельзя — с индексаторами, деструкторами или типами, отличными от классов.

          Добавьте метод «GetKeyboardLayoutId()» возвращающий строку, содержащую текущую языковую раскладку.

    private static string GetKeyboardLayoutId()
    {
    
    _InstalledInputLanguages = InputLanguage.InstalledInputLanguages;
    
    // Получаем хендл активного окна
    IntPtr hWnd = GetForegroundWindow();
    // Получаем номер потока активного окна
    int WinThreadProcId = GetWindowThreadProcessId(hWnd, out _ProcessId);
    
    // Получаем раскладку
    IntPtr KeybLayout = GetKeyboardLayout(WinThreadProcId);
    // Циклом перебираем все установленные языки для проверки идентификатора
    for (int i = 0; i < _InstalledInputLanguages.Count; i++)
    {
    if (KeybLayout == _InstalledInputLanguages[i].Handle)
    {
    _CurrentInputLanguage = _InstalledInputLanguages[i].Culture.ThreeLetterWindowsLanguageName.ToString();
    }
    }
    return _CurrentInputLanguage;
    
    }

          Чтобы воспользоваться данным методом перейдите в конструктор формы и сделайте двойной клик левой клавишей мыши по компоненту «timer1». Вы перейдете в автоматически созданный метод «timer1_Tick». Добавьте в него приведенный ниже листинг.

    label1.Text = GetKeyboardLayoutId();

          Запустите ваш проект, нажав на клавиатуре клавишу «F5». После запуска программы метод «GetKeyboardLayoutId» выведет вам в компонент «label1» трехбуквенный код текущей раскладки клавиатуры, определенный в формате Windows API. Пример работы программы, с выводом трехбуквенного кода для английского языка:

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

    Вы так же можете получить двухбуквенный код по стандарту ISO 639-1, например:

    • Английский язык обозначается en (от English);
    • Французский язык обозначается fr (от French);
    • Немецкий язык обозначается de (от самоназвания Deutsch);
    • Итальянский язык обозначается it (от Italian);
    • Японский язык обозначается ja (от англ. Japanese, хотя его самоназвание яп. Nihongo);
    • Португальский язык обозначается pt (от Portuguese);
    • Русский язык обозначается ru (от англ. Russian);
    • Испанский язык обозначается es (от самоназвания español);
    • Шведский язык обозначается sv (от самоназвания Svenska).
    Получить дополнительную информацию по стандарту «ISO 639-1:2002» вы можете, перейдя по адресу http://ru.wikipedia.org/wiki/ISO_639-1.

    Для реализации данной задачи замените приведенный ниже листинг:

    for (int i = 0; i < _InstalledInputLanguages.Count; i++)
    {
    if (KeybLayout == _InstalledInputLanguages[i].Handle)
    {
    _CurrentInputLanguage =
    _InstalledInputLanguages[i].Culture.ThreeLetterWindowsLanguageName.ToString();
    }
    }

    На:

    for (int i = 0; i < _InstalledInputLanguages.Count; i++)
    {
    if (KeybLayout == _InstalledInputLanguages[i].Handle)
    {
    _CurrentInputLanguage =
    _InstalledInputLanguages[i].Culture.ThreeLetterWindowsLanguageName.ToString();
    _CurrentInputLanguage +=
    ", Двухбуквенный код ISO 639-1 (" +
    _InstalledInputLanguages[i].Culture.TwoLetterISOLanguageName.ToString() + ")";
    }
    }

    Пример работы программы, с выводом трехбуквенного кода для английского языка:

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

    Ссылка для скачивания примера: Rusfolder.net

    Проверка раскладки клавиатуры: Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9