- Label— Для вывода состояния раскладки клавиатуры;
- Timer – Для запуска проверки состояния клавиатуры через определенный интервал времени.
У вас получится приведенный ниже пример.
Выберете компонент «Timer», который вы добавили на главную форму вашего проекта. Сделайте клик правой клавишей мыши по нему и выберите из появившегося контекстного меню, пункт «Свойства».
Выставьте в свойствах компонента, следующие параметры:
| Параметр | Значение | Описание |
|---|---|---|
| Enabled | True | Запуск таймера, при старте вашей программы |
| Interval | 1000 | Интервал проверки, раскладки клавиатуры, равный одной секунде |
Перейдите в листинг вашего проекта, нажав на клавиатуре, клавишу «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;
Добавьте метод «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).
Для реализации данной задачи замените приведенный ниже листинг:
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
0.00 (0%) 0 votes
















